135

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

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

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

4

13 回答 13

86

我会说校验和 必然hashcode。但是,并非所有哈希码都能产生良好的校验和。

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

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

于 2009-01-20T09:31:16.627 回答
44

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

  • 哈希码 - 设计为在其域中随机(以尽量减少哈希表等中的冲突)。密码散列码也被设计为在计算上无法逆转。
  • 校验和 - 旨在检测数据中最常见的错误,并且通常可以快速计算(用于有效校验和快速数据流)。

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

于 2009-01-20T09:43:40.033 回答
25

确实有一些区别:

  • 当输入不同时(尽可能频繁),校验和只需要不同,但它们的计算速度几乎同样重要。
  • 哈希代码(用于哈希表)具有相同的要求,此外它们应该均匀分布在代码空间中,尤其是对于相似的输入。
  • 加密散列具有更严格的要求,即给定散列,您不能构造产生此散列的输入。计算时间排在第二位,根据应用程序,甚至可能希望哈希的计算速度非常慢(以对抗暴力攻击)。
于 2009-01-20T09:46:09.000 回答
15

哈希码和校验和都用于从数据项创建短数值。不同之处在于校验和值应该改变,即使只是对数据项进行了很小的修改。对于散列值,要求仅仅是现实世界的数据项应该具有不同的散列值。

一个明显的例子是字符串。字符串的校验和应该包括每一位,并且顺序很重要。另一方面,哈希码通常可以实现为有限长度前缀的校验和。这意味着“aaaaaaaaaaaba”的哈希值与“aaaaaaaaaaab”相同,但哈希算法可以处理这种冲突。

于 2009-01-20T09:46:17.877 回答
10

维基百科说得很好:

校验和函数与散列函数、指纹、随机函数和加密散列函数有关。然而,这些概念中的每一个都有不同的应用,因此也有不同的设计目标。校验位和奇偶校验位是校验和的特殊情况,适用于小数据块(例如社会保险号、银行帐号、计算机字、单字节等)。一些纠错码基于特殊校验和,不仅可以检测常见错误,还可以在某些情况下恢复原始数据。

于 2009-01-20T09:32:11.803 回答
9

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

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

于 2018-03-13T11:15:20.590 回答
5

校验和可防止意外更改。

加密哈希可以防止非常积极的攻击者。

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

但是,如果您假设有人主动且智能地修改了网络上的消息,并且您希望防止此类攻击者受到攻击,那么请使用加密哈希(我忽略了对哈希进行加密签名,或者使用辅助通道等,因为这个问题似乎并没有回避这一点)。

于 2014-11-20T20:14:44.440 回答
4

这些天它们是可以互换的,但是在过去,校验和是一种非常简单的技术,您可以将所有数据(通常以字节为单位)相加并在最后加上一个字节,该值在..那么您希望知道是否有任何原始数据已损坏。类似于校验位,但带有字节。

于 2009-01-20T09:33:23.377 回答
4

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

  • 校验和用于查明输入中的某些内容是否已更改。

  • 哈希码用于找出输入中的某些内容是否发生了变化在各个哈希码值之间保持尽可能大的“距离”。

    此外,与此规则相反,可能对哈希函数有进一步的要求,例如能够尽早形成哈希码值的树/集群/桶。

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


关于概率:

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

  • 如果您的随机输入数据中恰好有 1 位发生了变化,那么无论输入数据有多大,您都将能够 100% 地检测到这一点。

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

    ...

这意味着,如果输入数据中的位数比哈希/校验和值中的位数大很多倍,那么对于不同的输入值,您实际获得不同哈希/校验和值的概率会降低,并且不是常数

于 2014-02-27T04:35:10.533 回答
2

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

于 2009-01-20T09:38:17.347 回答
0

在 Redis 集群数据分片中,它使用 ahash slot来决定它去哪个节点。以下面的模运算为例:

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

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

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

于 2020-06-04T19:50:45.167 回答
-1
  • hash code(Sip Hash)通常用于基于哈希表的结构(Dictionary、Set、HashMap...),其中基本操作具有恒定的时间 - O(1)
  • check sum(MD5, SHA) 用于表示数据完整性

主要区别在于它check sum必须是唯一的,而hash code对于不同的对象可以是相同的。例如,在 Java 或 Swift 中,您hash code受限于Int. 通常与equals函数配合使用。两个不同的对象可以有相同的hash code

[Java 哈希码]

于 2020-11-19T21:39:30.030 回答
-4

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

循环冗余校验(CRC)是完全不同的东西,更复杂,不称为校验和。它是多项式系列的应用,它能够纠正生成它的数据字段中任何选定数量的单个损坏位。CRC 的创建会产生比原始数据字段更大的数字(与校验和不同) - 因此名称中包含“冗余”一词以及您为纠错功能付出的代价。因此,CRC 不是散列,不得混淆或命名为校验和,因为冗余必然会增加原始数据的大小。

于 2020-02-24T15:59:16.803 回答