哈希代码和校验和 – 有什么区别?
我的理解是,哈希码和校验和是相似的东西 – 一个数值,计算一个数据块,这是相对独特的。
即,产生相同数字哈希/校验和值的两个数据块的概率足够低,以致于为了应用的目的可以忽略它。
那么对于同样的事情,我们有两个词,还是哈希码和校验和之间有重要的区别?
我会说校验和 必然是一个哈希码 。 但是,并不是所有的哈希码都有很好的校验和。
校验和有一个特殊的目的,它validation或检查数据的完整性(有些可以通过允许错误纠正来超越)。 “好”的校验和很容易计算,并且可以检测到许多types的数据损坏(例如一个,两个,三个错误的位)。
哈希码简单地描述了一个将数据映射到某个值的math函数 。 当用作数据结构索引的方法(例如散列表)时,低碰撞概率是可取的。
每个人背后都有一个不同的目的:
- 散列码 – 被devise为在其域中是随机的(以最小化散列表等中的冲突)。 encryption哈希码也被devise为在计算上不可逆转。
- 校验和 – devise用于检测数据中最常见的错误,并经常快速计算(用于有效校验快速数据stream)。
在实践中,相同的function通常对两个目的都有好处。 特别是,一个密码强的散列码是一个很好的校验和(如果一个随机错误会破坏一个强大的散列函数几乎是不可能的),如果你能承担计算成本。
确实有一些区别:
- 当input不同时(尽可能经常),校验和只需要有所不同,但是它们快速计算几乎同样重要。
- 哈希代码(用于哈希表)具有相同的要求,另外它们应该均匀分布在代码空间中,特别是对于类似的input。
- encryption哈希有更严格的要求,给定一个散列,你不能构build一个input产生这个散列。 计算时间次之,根据应用程序,甚至可能希望散列计算速度非常慢(以对抗暴力攻击)。
维基百科说得好:
校验和函数与散列函数,指纹,随机函数和encryption散列函数有关。 但是,这些概念中的每一个都有不同的应用,因此有不同的devise目标 校验位和校验位是校验和的特殊情况,适用于小块数据(如社会安全号码,银行帐号,计算机字,单字节等)。 一些纠错码是基于特殊校验和的,不仅检测常见错误,而且在某些情况下还可以恢复原始数据。
哈希码和校验和都用于从数据项创build简短的数值。 不同之处在于校验和值应该改变,即使对数据项进行小的修改。 对于散列值,要求仅仅是真实世界的数据项应该具有不同的散列值。
一个明确的例子是string。 一个string的校验和应该包括每一位,而且顺序很重要。 另一方面,哈希码通常可以实现为有限长度前缀的校验和。 这将意味着“aaaaaaaaaaba”将与“aaaaaaaaaaab”相同的散列,但散列algorithm可以处理这种冲突。
校验和可防止意外更改。
encryption散列可以防止非常积极的攻击者。
当你在线上发送比特时,可能会偶然发生某些比特被翻转,删除或插入的情况。 为了让接收者检测到(或者有时是正确的)这样的事故,发送者使用校验和。
但是,如果你假设有人正在智能地修改networking上的消息,并且想要防范这种攻击者,那就使用encryption哈希(我忽略encryption签名哈希,或者使用辅助通道等,因为这个问题似乎并没有逃避)。
现在它们是可以互换的,但在过去的一段时间里,校验和是一个非常简单的技术,你可以把所有的数据加起来(通常以字节为单位),然后在那个值的最后加上一个字节,然后你希望知道是否有任何原始数据已损坏。 类似于一个检查位,但与字节。
当涉及为文件或数据片段创build的代码(数字或其他)时,我倾向于使用“校验和”这个词,以便检查文件或数据是否已被破坏。 我遇到的最常见的用法是检查通过networking发送的文件没有被修改(故意或其他)。
散列码和校验和函数之间的区别在于,它们被devise用于不同的目的。
-
校验和用来确定input内容是否发生了变化。
-
散列码用于确定input中的某些内容是否发生了变化, 并在各个散列码值之间具有尽可能多的“距离”。
此外,哈希函数可能还有其他要求,与此规则相反,比如早期形成哈希码值的树/簇/桶的能力。
如果你添加一些共享的初始随机化,你可以进入现代encryption/密钥交换的概念。
关于概率:
例如,假设input数据实际上总是变化(100%的时间)。 假设你有一个“完美的”散列/校验和函数,它产生一个1位散列/校验和值。 因此,对于随机input数据,您将得到不同的哈希/校验和值,50%的时间。
-
如果随机input数据中只有1位发生了变化,那么无论input数据有多大,您都可以检测到100%的时间。
-
如果随机input数据中的2位发生了变化,则检测到“变化”的概率被除以2,因为两个变化可能相互抵消,并且没有散列/校验和函数会检测到input数据中的2位实际上是不同的。
…
这意味着,如果input数据中的位数比散列/校验和值中的位数多倍,那么对于不同的input值,实际获得不同散列/校验和值的概率就会降低, 而不是不变 。