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

Hash 是否存在可以保证哈希算法唯一的情况?,hash,unique,sha256,hash-code-uniqueness,Hash,Unique,Sha256,Hash Code Uniqueness,如果我使用比数据(例如sha-256)字节大的散列算法对大小受限的类似数据(例如,社会保险号)进行散列,散列会保证与原始数据相同的唯一性级别吗?如果使用类似sha的加密散列,那么简短的回答是肯定的。您始终可以创建一个保证唯一性的自定义哈希。对于已知域(如SSN)中的数据,练习相对简单 如果目标散列值的可用位实际上比正在散列的多,则散列只是将输入值映射到一个可用的输出值。这将是一个简单的线性映射,从作为多字节整数的输入值到作为多字节整数的输出 当您的目标散列值的位数少于正在散列的位数时,就无法保证

如果我使用比数据(例如sha-256)字节大的散列算法对大小受限的类似数据(例如,社会保险号)进行散列,散列会保证与原始数据相同的唯一性级别吗?

如果使用类似sha的加密散列,那么简短的回答是肯定的。

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

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


当您的目标散列值的位数少于正在散列的位数时,就无法保证唯一性

a的一个关键特性是,无论输入如何,您都不会受到任何合理怀疑的碰撞。这对于小于输出大小的输入也是有效的,这与熵较小的较长消息相同。因此,您可以使用SHA-2而不用担心冲突。

哈希冲突的概率与输入字符串的大小无关(除非它指示需要在多个输入之间保持唯一性)。使用完美的哈希算法对0和1进行哈希运算时,可能会发生哈希冲突,尽管这种可能性为1/(2^位长度)。在SHA-256的情况下,这实际上是零

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

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

    • 其他人指出,碰撞不应成为一个问题;这就是加密安全散列函数的全部要点。我只想补充以下几点:

      • 如果您的输入集足够小(例如,数据是SSN——不到十亿个),则无冲突是可以验证的:只需彻底测试它
      • 如果输入集太大,无法彻底扫描,则预计无法证明是否存在冲突。好的散列函数被期望充当随机预言器,在随机预言器上,如果不进行详尽的尝试,就无法证明这样的属性。能够证明没有碰撞,这看起来可疑地像是该功能的一个弱点

      谢谢。我是这么想的,但是我找不到一个支持它的参考资料,我也没有足够的智慧去钻研数学并得出这样或那样的结论!如上所述,加密散列只是说碰撞是非常不可能的,而不是不可能的。@Novelcrat,原始问题的简短答案是肯定的。虽然理论上碰撞是可能的,但发现碰撞的平均时间比太阳演化成红巨星并摧毁地球所需的时间要长得多。@Novelcrat。另外,如果你能发布两个10位数的SSN,它们产生相同的SHA-256哈希值,我会付给你1000美元。@DieinSente我找到了!付钱给我,我会让你知道的汉克斯。我正在考虑对ssn和“帐户”标识符进行哈希运算,这可能会随着每个实现的不同而有所不同。因此,如果我可以使用散列函数而不是预先生成的函数,那就更好了。如果目标是屏蔽社会保障号码,那么实现一对一的线性映射函数就不够了,因为从输出的一些样本中计算原始输入会相当容易。此外,输入字符串的长度肯定不会影响加密安全哈希函数的有效性,因此使用已知的哈希算法是解决问题的方法。不过,我并不是在质疑安全问题。我要求的是当数据的大小小于散列的大小时,散列的唯一性概率。(我需要结果值是确定性的/可重复的,因此执行x字节的随机salt对我来说不起作用。我可能通过在每个实现中添加常量字符来“salt”——例如,我可能在散列之前将类似“593jra”的字符附加到ssn中)。生日悖论不是基于鸽子洞原理吗?如果是这样的话,理论上我没有一个鸽子洞的场景。鸽子洞原理是一个简单的概念,当你有比鸽子洞更多的物品时,你肯定会发生碰撞。生日悖论只是说,如果你的物品与归档的比率“高”,你真的很可能会发生碰撞。其中“高”由上述公式定义。我相信你不需要公式中的
      1-
      部分,除非你试图表示没有碰撞的概率。顺便问一下,你能告诉我们这个公式的来源吗?