我的理解是哈希码和校验和是类似的东西 - 为数据块计算的数值,它是相对独特的.
即,产生相同数字散列/校验和值的两个数据块的概率足够低,以至于出于应用目的可以忽略它.
那么我们是否有两个单词用于相同的事情,或者哈希码和校验和之间是否存在重要差异?
我会说校验和 必然是一个哈希码.但是,并非所有哈希码都能成为良好的校验和.
校验和有一个特殊目的---它验证或检查数据的完整性(有些可以通过允许纠错来超越它)."好"校验和易于计算,并且可以检测多种类型的数据损坏(例如,一个,两个,三个错误位).
哈希码简单地描述了将数据映射到某个值的数学函数.当用作数据结构(例如哈希表)中的索引的手段时,期望低冲突概率.
每个人背后都有不同的目的:
散列码 - 设计为在其域中随机(以最小化散列表中的冲突等).加密哈希码也被设计成在计算上不可逆转.
校验和 - 旨在检测数据中最常见的错误,并且通常可以快速计算(有效校验快速数据流).
在实践中,相同的功能通常对两种目的都有好处.特别是,加密强哈希码是一个很好的校验和(如果你能负担得起计算成本,那么随机错误几乎不可能破坏强哈希函数).
确实存在一些差异:
当输入不同(尽可能频繁)时,校验和只需要不同,但它们的计算速度几乎同样重要.
散列码(用于散列表)具有相同的要求,此外它们应均匀分布在代码空间中,尤其是对于相似的输入.
密码散列有很多更严格的要求,即给定一个哈希,你不能构造产生这个哈希的输入.计算时间排在第二位,并且取决于应用程序,甚至可能希望散列计算非常慢(以便对抗强力攻击).
维基百科说得好:
校验和函数与散列函数,指纹,随机函数和加密散列函数有关.但是,每个概念都有不同的应用,因此具有不同的设计目标.校验位和奇偶校验位是校验和的特殊情况,适用于小块数据(例如社会保险号,银行帐号,计算机字,单字节等).一些纠错码基于特殊校验和,不仅可以检测常见错误,还可以在某些情况下恢复原始数据.
哈希码和校验和都用于从数据项创建短数值.不同之处在于校验和值应该更改,即使对数据项进行了少量修改也是如此.对于散列值,要求仅仅是真实世界数据项应具有不同的散列值.
一个明显的例子是字符串.字符串的校验和应包括每个位,并且顺序很重要.另一方面,哈希码通常可以实现为有限长度前缀的校验和.这意味着"aaaaaaaaaaba"会像"aaaaaaaaaaab"一样散列,但哈希算法可以处理这种冲突.