10

如果我使用比数据(例如 sha-256)更大的字节大小的哈希算法对大小受限的类似数据(例如社会安全号码)进行哈希处理,哈希是否会保证与原始数据?

4

5 回答 5

6

散列冲突的概率与输入字符串的大小无关(除非它表明需要多少个输入来保持唯一性)。当您使用完美的散列算法散列 0 和 1 时,可能会发生散列冲突,尽管可能性是 1/(2^bit-length)。在 SHA-256 的情况下实际上为零。

哈希冲突是一个生日悖论问题。在 256 位散列的情况下,两个输入之间发生冲突的概率完全取决于输入的计数,并且是:

  • 1 - (2^256)!/ ((2^256^inputcount) * (2^256-inputcount)!) 或正如其他人所说——对于合理数量的输入,基本上为零。
于 2010-02-19T22:36:46.510 回答
5

您始终可以创建一个确保唯一性的自定义哈希。对于已知域(如 SSN)中的数据,练习相对简单。

如果您的目标哈希值实际上具有比您正在哈希的更多位,则哈希只是将输入值映射到可用输出值之一。这将是从作为多字节整数的输入值到作为多字节整数的输出的简单线性映射。

当您的目标哈希值的位数少于被哈希的位数时,则无法保证唯一性。

于 2010-02-19T22:01:34.493 回答
2

其他人指出,碰撞不应该是一个问题;这就是密码安全散列函数的全部意义所在。我只想添加以下内容:

  • 如果您的输入集足够小(例如,数据是 SSN——少于十亿个),那么可以验证是否没有碰撞:只需彻底测试即可。
  • 如果输入集太大而无法彻底扫描,则预计无法证明不存在碰撞。良好的散列函数应该充当随机预言机,并且在随机预言机上,如果不进行详尽尝试,您将无法证明这样的属性。能够证明不存在碰撞可能看起来像是该功能的弱点。
于 2010-02-22T02:44:49.417 回答
1

加密安全散列函数的一个关键特性是,无论输入如何,您都可以避免发生合理怀疑的冲突。这对于短于输出大小的输入也是有效的,这与熵很小的较长消息相同。因此,您可以使用 SHA-2 而不必担心冲突。

于 2010-02-19T22:29:07.707 回答
1

如果您使用的是像 SHA 这样的加密哈希,那么简短的回答是肯定的。

于 2010-02-19T21:53:39.040 回答