哈希码和校验和 - 有什么区别?

时间:2009-01-20 09:28:24

标签: language-agnostic hash computer-science checksum

我的理解是哈希码和校验和是类似的东西 - 为数据块计算的数值,相对唯一。

即。产生相同数字散列/校验和值的两个数据块的概率足够低,可以为应用程序的目的忽略它。

那么我们对同一件事有两个词,或者哈希码和校验和之间有重要区别吗?

13 个答案:

答案 0 :(得分:61)

我会说checksum 必然一个hashcode。但是,并非所有哈希码都能成为良好的校验和。

校验和有一个特殊目的---它验证或检查数据的完整性(有些可以通过允许error-correction来超越它)。 “好”校验和易于计算,可以检测多种类型的数据损坏(例如,一,二,三个错误位)。

哈希码只描述了将数据映射到某个值的mathematical function。当用作数据结构(例如哈希表)中的索引的手段时,期望低冲突概率。

答案 1 :(得分:39)

每个人背后都有不同的目的:

  • 哈希代码 - 设计为在其域中随机(以最小化哈希表中的冲突等)。加密哈希码也被设计为在计算上不可逆转。
  • 校验和 - 旨在检测数据中最常见的错误,并且通常可以快速计算(有效校验快速数据流)。

在实践中,相同的功能通常对两种目的都有好处。特别是,加密的强哈希码是一个很好的校验和(如果你能承担计算成本,那么随机错误几乎不可能破坏强哈希函数)。

答案 2 :(得分:20)

确实存在一些差异:

  • 当输入不同(尽可能频繁)时,校验和只需要有所不同,但它们的计算速度快得多。
  • 散列码(用于散列表)具有相同的要求,此外它们应均匀分布在代码空间中,尤其是对于类似的输入。
  • 加密哈希具有很多更严格的要求,给定哈希,您无法构造产生此哈希的输入。计算时间排在第二位,根据应用程序的不同,哈希的计算速度可能非常慢(为了对抗暴力攻击)。

答案 3 :(得分:8)

Wikipedia说得好:

  

校验和函数与哈希相关   功能,指纹,随机化   函数和加密哈希   功能。但是,每一个   概念有不同的应用   因此有不同的设计目标。   校验位和奇偶校验位是   校验和的特殊情况,   适用于小块数据   (如社会安全号码,银行   帐号,电脑字,   单字节等)。一些   纠错码基于   不仅检测的特殊校验和   常见错误但也允许   要恢复的原始数据   某些情况。

答案 4 :(得分:8)

哈希码和校验和都用于从数据项创建短数值。不同之处在于校验和值应该更改,即使对数据项进行了少量修改也是如此。对于哈希值,要求仅仅是实际数据项应具有不同的哈希值。

一个明显的例子是字符串。字符串的校验和应包括每个位,并且顺序很重要。另一方面,哈希码通常可以实现为有限长度前缀的校验和。这意味着“aaaaaaaaa”会像“aaaaaaaaaaab”一样散列,但散列算法可以处理这种碰撞。

答案 5 :(得分:3)

这些天他们是可以互换的,但是在过去的日子里,校验和是一个非常简单的技术,你可以在其中添加所有数据(通常以字节为单位)并在结尾处添加一个字节,然后在...我希望知道是否有任何原始数据被破坏了。类似于检查位,但带有字节。

答案 6 :(得分:3)

校验和可防止意外更改。

加密哈希可以防止非常有动力的攻击者。

当您在线路上发送位时,可能会意外地发生某些位被翻转,删除或插入。为了让接收方能够检测(或有时纠正)这样的事故,发送方使用校验和。

但是如果你假设某人主动且智能地修改了线路上的消息并且你想要防止这种类型的攻击者,那么使用加密哈希(我忽略加密签名哈希,或使用辅助渠道或因为这个问题似乎没有得到解决。)

答案 7 :(得分:2)

哈希码和校验和函数之间的区别在于,它们是为不同目的而设计的。

  • 校验和用于查找,如果输入中的内容已更改。

  • 哈希码用于找出如果输入中的某些内容已更改,以便在各个哈希码值之间保持尽可能多的“距离”尽可能。

    此外,可能是哈希函数的进一步要求,与此规则相反,就像早期形成树/簇/桶哈希码值的能力一样。

    如果你添加一些共享的初始随机化,你就会得到现代加密/密钥交换的概念。


关于概率:

例如,假设输入数据实际上总是在变化(100%的时间)。假设您有一个“完美”的散列/校验和函数,它会生成1位散列/校验和值。因此,对于随机输入数据,您将获得50%的不同哈希/校验和值。

  • 如果随机输入数据中的1位发生了变化,无论输入数据有多大,您都可以100%检测到这一点。

  • 如果随机输入数据中的2位发生了变化,则检测到“变化”的概率除以2,因为两个变化都可能相互抵消,并且没有散列/校验和函数会检测到2位是实际上输入数据不同。

    ...

这意味着,如果输入数据中的位数比散列/校验和值中的位数大几倍,那么对于不同的输入值,实际获得不同散列/校验和值的概率会降低, 不是常数

答案 8 :(得分:1)

在引用为文件或数据创建的代码(数字或其他)时,我倾向于使用单词checksum,这些数据可用于检查文件或数据是否已损坏。我遇到的最常见用法是检查通过网络发送的文件是否未被更改(故意或其他方式)。

答案 9 :(得分:1)

  

虽然散列和校验和的相似之处在于它们都根据文件的内容创建了一个值,但散列与以下内容不同   创建校验和。校验和旨在验证(检查)   哈希表示数据的完整性和识别数据传输错误   旨在创建数据的唯一数字指纹。

来源:CompTIA®安全+网络安全基础知识指南 - 第五版 - Mark Ciampa - 第191页

答案 10 :(得分:0)

在Redis集群数据分片中,它使用hash slot来确定它去哪一个节点。例如下面的取模运算:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

6在不同的输入上出现两次。哈希的目的仅仅是将输入值映射到输出值,唯一性不是交易的一部分。因此,在哈希世界中,两种产生相同输出的不同输入是可以的。

另一方面,即使输入中的一位发生变化,校验和也必须使输出有所不同,因为它的目的不是映射,而是检测数据损坏。因此,产生相同输出的两个不同输入在校验和中是不可接受的。

答案 11 :(得分:0)

  • hash code(Sip哈希)通常用于哈希表,其中访问时间接近O(1)
  • check sum(MD5,SHA)用于指示数据完整性

主要区别是check sum必须唯一,而hash code对于不同的对象可以相同

答案 12 :(得分:-4)

校验和只是通过oring(通过逻辑加法运算,因此求和)从数据字段生成的数字。校验和具有检测生成数据字段的数据字段中任何位或位数的损坏的能力,即,它检查所有错误,无法对其进行更正。校验和是哈希,因为校验和的大小小于原始数据。是的,您会遇到冲突,因为校验和对数据字段中的位位置完全不敏感。

循环冗余校验(CRC)完全不同,更复杂,,不称为校验和。它是多项式级数的应用,具有校正任何选定数量的个体的能力。生成它的数据字段中的损坏位。 CRC的创建将导致其大小比原始数据字段大得多(与校验和不同),因此,名称包括单词“ redundancy”(冗余)以及为纠错功能所支付的价格。因此,CRC并非哈希,也不能混淆或命名为校验和,因为冗余必定会增加原始数据的大小。