
散列是指从可变大小的输入生成固定大小的输出的过程。这是通过使用称为散列函数(作为散列算法实现)的数学公式来完成的。
尽管并非所有哈希函数都涉及密码学的使用 ,但所谓的密码哈希函数是加密货币的核心。多亏了它们,区块链和其他分布式系统能够实现显着水平的 数据完整性和安全性。
传统和加密散列函数都是确定性的。确定性意味着只要输入不变,散列算法将始终产生相同的输出(也称为摘要或散列)。
通常,加密货币的散列算法被设计为单向函数,这意味着如果没有大量的计算时间和资源,它们就无法轻易恢复。换句话说,从输入创建输出非常容易,但在相反的方向(仅从输出生成输入)相对困难。一般来说,越难找到输入,哈希算法被认为越安全。
不同的散列函数将产生不同大小的输出,但每种散列算法可能的输出大小始终是恒定的。例如,SHA-256 算法只能生成 256 位的输出,而 SHA-1 将始终生成 160 位的摘要。
为了说明这一点,让我们通过 SHA-256 哈希算法(比特币中使用的算法)运行“Bitcoin”和“bitcoin”这两个词。
请注意,微小的更改(第一个字母的大小写)会导致完全不同的哈希值。但由于我们使用 SHA-256,输出将始终具有 256 位(或 64 个字符)的固定大小 - 无论输入大小如何。此外,无论我们通过算法运行这两个单词多少次,两个输出都将保持不变。
相反,如果我们通过 SHA-1 哈希算法运行相同的输入,我们将得到以下结果:
值得注意的是,首字母缩略词 SHA 代表安全哈希算法。它指的是一组加密哈希函数,包括 SHA-0 和 SHA-1 算法以及 SHA-2 和 SHA-3 组。SHA-256 是 SHA-2 组的一部分,还有 SHA-512 和其他变体。目前,只有 SHA-2 和 SHA-3 组被认为是安全的。
传统的哈希函数具有广泛的用例,包括数据库查找、大文件分析和数据管理。另一方面,加密散列函数广泛用于信息安全应用,例如消息认证和数字指纹。就比特币而言,加密哈希函数是挖矿过程的重要组成部分, 也在新地址和密钥的生成中发挥作用。
散列的真正威力在于处理大量信息时。例如,可以通过哈希函数运行一个大文件或数据集,然后使用其输出来快速验证数据的准确性和完整性。由于散列函数的确定性,这是可能的:输入将始终产生简化的、压缩的输出(散列)。这种技术消除了存储和“记住”大量数据的需要。
散列在区块链技术的背景下特别有用。比特币区块链有几个涉及散列的 *** 作,其中大部分在挖掘过程中。事实上,几乎所有的加密货币协议都依赖散列来将交易组链接和压缩成块,并在每个块之间产生加密链接,从而有效地创建区块链。
同样,部署密码技术的散列函数可以定义为密码散列函数。一般来说,破解密码哈希函数需要无数次的蛮力尝试。对于“还原”加密哈希函数的人来说,他们需要通过反复试验来猜测输入是什么,直到产生相应的输出。然而,也有可能不同的输入产生完全相同的输出,在这种情况下会发生“冲突”。
从技术上讲,加密哈希函数需要遵循三个属性才能被视为有效安全。我们可以将这些描述为抗碰撞性、抗原像性和抗二次原像性。
在讨论每个属性之前,让我们用三个简短的句子总结它们的逻辑。
如前所述,当不同的输入产生完全相同的散列时,就会发生冲突。因此,哈希函数被认为是抗冲突的,直到有人发现冲突为止。请注意,任何散列函数都将始终存在冲突,因为可能的输入是无限的,而可能的输出是有限的。
换句话说,当发现碰撞的可能性非常低以至于需要数百万年的计算时,哈希函数是抗碰撞的。因此,尽管没有无冲突的哈希函数,但其 中一些函数足够强大,可以被视为具有抵抗力(例如,SHA-256)。
在各种 SHA 算法中,SHA-0 和 SHA-1 组不再安全,因为已经发现冲突。目前,SHA-2 和 SHA-3组被认为是抗冲突的。
原像电阻的特性与单向函数的概念有关。当有人找到生成特定输出的输入的可能性非常低时,哈希函数被认为是抗原像的。
请注意,此属性与前一个属性不同,因为攻击者会试图通过查看给定的输出来猜测输入是什么。另一方面,当有人发现产生相同输出的两个不同输入时,就会发生冲突,但使用哪个输入并不重要。
原像抗性的特性对于保护数据很有价值,因为消息的简单散列可以证明其真实性,而无需披露信息。在实践中,许多服务提供商和 Web 应用程序存储和使用从密码生成的哈希值,而不是明文密码。
为简化起见,我们可以说第二原像电阻介于其他两个属性之间。当有人能够找到一个特定的输入,该输入生成与他们已经知道的另一个输入相同的输出时,就会发生二次原像攻击。
换句话说,第二原像攻击涉及寻找碰撞,但不是搜索生成相同散列的两个随机输入,而是搜索生成由另一个特定输入生成的相同散列的输入。
因此,任何抗碰撞的哈希函数也能抗第二原像攻击,因为后者总是意味着碰撞。然而,人们仍然可以对抗碰撞函数执行原像攻击,因为它意味着从单个输出中找到单个输入。
比特币挖矿有很多步骤 涉及哈希函数,例如检查余额、链接交易输入和输出,以及对区块内的交易进行哈希处理以形成 默克尔树。但比特币区块链安全的主要原因之一 是矿工需要执行无数的散列 *** 作,以便最终为下一个区块找到有效的解决方案。
具体来说,矿工在为其候选块创建哈希值时必须尝试几种不同的输入。本质上,如果他们生成以一定数量的零开头的输出哈希,他们将只能验证他们的块。零的数量决定了挖矿难度,它根据网络的哈希率而变化。
在这种情况下,哈希率表示在比特币挖矿中投入了多少计算机能力。如果网络的哈希率增加,比特币协议会自动调整挖矿难度,使挖出一个区块所需的平均时间保持在接近 10 分钟。相反,如果几个矿工决定停止挖矿,导致算力大幅下降,则会调整挖矿难度,使其更容易挖矿(直到平均出块时间回到10分钟)。
请注意,矿工不必发现冲突,因为他们可以生成多个散列作为有效输出(从一定数量的零开始)。所以对于某个区块有几种可能的解决方案,矿工只需要找到其中一种——根据挖矿难度确定的阈值。
由于比特币挖矿是一项成本密集型任务,矿工没有理由欺骗系统,因为这会导致重大的经济损失。加入区块链的矿工越多,它就变得越大越强大。(国内禁止参与挖矿)
毫无疑问,哈希函数是计算机科学中必不可少的工具,尤其是在处理大量数据时。当与密码学结合时,散列算法可以非常通用,以多种不同的方式提供安全性和身份验证。因此,加密哈希函数对几乎所有加密货币网络都至关重要,因此了解它们的属性和工作机制对于任何对区块链技术感兴趣的人肯定会有所帮助。
摘要 Microsoft SQL Server 从版本 开始使用内置位图来提高执行查询的速度 通过在 SQL Server 中引入新的运算符 可以将进一步的位图筛选技术应用于源自大型数据集的 更快速的查询结果 简介本文首先介绍了在 Microsoft® SQL Server 的查询优化中位图的使用 然后介绍了它们在 SQL Server &# ; 中增强的应用 SQL Server Microsoft SQL Server 在所有的散列联接中无提示使用位图 散列联接包含创建和探测两个阶段 在创建阶段 其中一个已联接的表(也称为外部表)的所有联接键都被分布到一个散列表中 作为该散列 *** 作的副产品 SQL Server 将生成一个独立的位图 其中 表示 外部表中没有键值分布到该位 表示 外部表中有一个或多个键值分布到该位 位图的大小是在根据外部表中唯一值的数量而进行的优化查询过程中决定的 一旦外部表中所有的行都被散列后 位图就由 和 组成 然后将使用与处理外部键相同的散列算法对探测表(也称为内部表)中的每个键进行分布 在检查和搜索创建阶段的散列表之前 我们将先检查位图 如果对应的条目为 则该行在外部表中不可能有匹配值 因此将被丢弃 由于搜索位图要比搜索散列表更经济 处理不生成联接记录的内部表中的行要比处理不带位图的行快 由于位图是散列联接不可分割的一部分 因此位图将自动创建并且不会显示在显示方案的输出中 SQL Server Microsoft SQL Server 非常有效地使用了类似的位图 不仅在内部散列联接中使用 而且还用于外部联接运算符以删除包含不能生成任何联接记录的键值的行 在创建位图的显示方案输出中 有一个 Bitmap Create 运算符 在查询优化过程中 位图被自动引用到查询计划中 以下查询示例便使用了包含这些位图的计划 SELECT S_NAME S_ADDRESS S_PHONE S_MENT PS_PARTKEY FROMSUPPLIER PARTSUPPWHERE S_SUPPKEY = PS_SUPPKEY AND PS_PARTKEY beeen AND 该查询从 SUPPLIER 表中选择所有供应商 这些供应商生产 系列中的所有部件(部件键值在 到 之间) 除 SUPPLIER 表外 我们还使用 PARTSUPP(部件供应商)表 它包含了(针对每个部件)生产同一部件的不同供应商的所有记录 图 显示了由 SQL Server 生成的显示方案图解 图 示例查询的执行计划图解对于每个数据流 位图都在联接的外部输入端上的散列联接之前创建 从左至右和从上至下查看上面的显示计划图解 将发现 PARTSUPP 表的扫描是并行的 后面的交换运算符 (Paralleli /Repartition Streams) 使用键值分配行 这样它们将在并行的散列匹配(联接)之前被置于包含 SUPPLIER 表的再分配行的对应流中 先执行顶部分支 直至散列联接的散列表被填充 底部分支没有活动为止 在扫描 SUPPLIER 表时 我们已使用 PARTSUPP 键(在本查询中为 PS_SUPPKEY 列)在顶部分支上创建了位图 每一个进入散列联接的流都有一个位图 当 SUPPLIER 行在扫描后输入交换运算符时 我们首先要判断它们将进入哪一个流 如果在对应于键值(S_SUPPKEY 列)的项目中该行的位图包含 则丢弃该行 因此 在被置于适当的交换输出流之前 不符合条件的行将被删除 SQL Server 只在并行查询计划中使用这些位图 这是因为如果没有交换运算符 则在散列联接中的位图上没有额外的补偿 除了上述使用散列联接的方案外 SQL Server 还在合并联接中使用这些位图 但仍然只限于并行计划 并且在外部分支上存在 SORT 运算符 SORT 运算符使 SQL Server 在处理内部表中的行之前先处理所有外部行 因此使我们可以创建位图 如果在外部分支上没有 SORT 运算符 将同时处理合并联接中来自内部表和外部表中的行 这样就不能使用位图了 测试结果显示速度的提高通常 由于采用位图而产生的性能提高取决于被筛选出的行数 该数目是可以变化的 因此根据查询执行中其他运算符的开销的不同 速度提高的幅度可以从小到无法测量到非常显著 图 显示了在大型数据库( GB 的表 GB 的索引)中测试三种复杂查询时所观察到的速度提高 测试是在实验室中使用 RAM 为 GB 的 路 MHz 计算机完成的 查询 A 为包含结果汇总和排序的三个表(最大的表大约包含 GB 数据)的联接查询 查询 B 为包含相关子查询的查询 查询 C 为在联接顶部包含汇总的六个表的联接查询 图 位图筛选对三个大型数据库的复杂查询的优化结论在查询优化过程中使用位图是 SQL Server 采用的众多技术之一 旨在从大型数据集(如企业数据库中的数据集)中最快的获取查询结果 通过减少需要处理的行数 使内部联接和外部联接查询更有效 迅速返回数据的同时还减少了服务器处理的工作量 lishixinzhi/Article/program/SQLServer/201311/22086
KEY通常是INDEX同义词。如果关键字属性PRIMARY KEY在列定义中已给定,则PRIMARY KEY也可以只指定为KEY。这么做的目的是与其它数据库系统兼容。 PRIMARY KEY是一个唯一KEY,此时,所有的关键字列必须定义为NOT NULL。如果这些列没有被明确地定义为NOT NULL,MySQL应隐含地定义这些列。一个表只有一个PRIMARY KEY。如果您没有PRIMARY KEY并且一个应用程序要求在表中使用PRIMARY KEY,则MySQL返回第一个UNIQUE索引,此索引没有作为PRIMARY KEY的NULL列
以上就是关于什么是哈希全部的内容,包括:什么是哈希、Microsoft SQL Server 2000 中的位图、mysql数据库的分区hash和key有什么不同啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)