是否存在可以保证哈希算法唯一的情况?

时间:2010-02-19 21:50:39

标签: hash unique sha256 hash-code-uniqueness

如果我使用字节大小比数据(例如sha-256)更大的散列算法散列大小受限的类似数据(例如社会安全号码),那么散列将保证相同的级别唯一性作为原始数据?

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

哈希冲突的概率与输入字符串的大小无关(除非它指示您需要保持唯一性所需的输入数量)。当您使用完美散列算法散列0和1时,可能会发生散列冲突,尽管可能性为1 /(2 ^位长)。在SHA-256的情况下实际上是零。

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

  • 1 - (2 ^ 256)! /((2 ^ 256 ^ inputcount)*(2 ^ 256-inputcount)!)或正如其他人所说的那样 - 对于合理数量的输入,基本上为零。

答案 2 :(得分:2)

其他人指出,碰撞不应该是一个问题;这是加密安全散列函数的重点。我想添加以下内容:

  • 如果你的输入设置足够小(例如数据是SSN - 它们的数量不到10亿),那么没有碰撞就可以验证:只需要详尽地测试它。
  • 如果输入集太大而无法彻底扫描,那么预计无法证明没有碰撞 。良好的哈希函数有望充当随机的神谕,而在随机的神谕中,如果不进行详尽的尝试,就无法证明这样的属性。能够证明没有碰撞可能会看起来像是功能的弱点。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

cryptographically secure hash function的一个关键特征是,无论输入如何,您都可以避免无可置疑的碰撞。这对于输出短于输出大小的输入也是有效的,这与具有小熵的较长消息相同。所以你可以使用SHA-2而不用担心碰撞。