HashCode与SHA-1的区别

9

我想比较一些代表树和缓存的大型对象并 缓存 一些内容,以避免每次将新对象与已经存在的对象进行比较...

问题是什么才是最好的 缓存 方式?(在性能和冲突之间取得折中...)

一方面,我有一个基于各种字段值的常规 hashCode 函数(遵循 effective Java 第三章)。但我无法评估这种方法可能产生的冲突。

另一方面,我有来自标准 java 发行版的 MessageDigest 方法,使用 SHA-1 算法。我认为这种方法不会很有效率,但我可能会有更少的冲突。我是正确的吗?在我的情况下,这是一个正确的解决方案还是我完全错了?

问题在于我不知道对象的大小。请注意,计算出的值将不会在 HashTable 中使用。

谢谢...

5个回答

15

请查看以下链接:

请记住以下几点:

  • 一个对象可能不相等,但具有相同的哈希码
  • 您遇到的对象越多,碰撞的可能性就越大。
  • 哈希码的有用程度取决于您如何实现检查。

通常情况下,您可以根据预期对象数量和可能哈希数(最大哈希值)来确定发生冲突的机会。详见http://en.wikipedia.org/wiki/Birthday_paradox

个人建议:Java对象(实例化的类)< 10,000?哈希码。表示文件/ blob/ 大量数据?SHA-1。我在数据库中使用SHA-1哈希值,以防止人们在同一文件上进行ETL工作多次。然后我再次使用SHA-1哈希在第二层中,以防止人们在多个文件中ETL相同的部分(例如,不同的文件但相同的顺序出现两次)。


3
哦,具体来说,http://en.wikipedia.org/wiki/Birthday_paradox#Probability_Table 这个链接可以帮助你省去数学计算,它表明当有9,300个对象(hashCode返回32位整数)时,发生碰撞的概率为1%。 - Jeff Ferland
根据您是否存储/重复使用数据和哈希,hashCode()可能不是一个好主意:hashCode()的合同不能保证在执行之间产生相同的结果(并且可能随着Java版本的更改而变化)。碰撞可能是一个问题,也可能不是一个问题(请参见答案),但如果您最终得到重复项/不匹配项,则相等对象的非碰撞(如果您不每次重新计算原始对象的哈希值)将是有问题的。 - user2039709

11

就我个人而言,我会在对象中使用 hashCode() 直到被证明任何可能的碰撞都是一个实际问题,避免过早对一个你可能并没有的问题进行优化。


有没有一种方法可以使用 hashCode() 来评估潜在的频率/概率? - LB40
请查看Autocracy的链接,但我不确定Bloch的hashcode()实现将返回哪个整数范围。 - matt b

7
因为生日问题的存在,发生碰撞的几率取决于您处理的项目数量。
SHA-1的160位空间非常大,我怀疑您是否会有足够的项目来看到碰撞。 hashCode()的32位空间在超过50,000个项目之前不应该有显着的碰撞。但是,这取决于使用良好的哈希算法。
为了应用像SHA-1这样的加密摘要,您需要将图形转换为字节字符串,这可能具有计算上的代价,并且可能会很复杂。

6
通常在查找重复文件/数据时,使用MD5是速度和碰撞机率之间的良好平衡。如果有人有意制造文件来欺骗您的程序(它略微容易受到碰撞攻击),则MD5不适用。但如果您只担心偶然的碰撞,则其128位宽度目前几乎始终足够。
SHA-1和SHA-256可为您提供一定程度的保护,以防止故意碰撞攻击(理论上存在,但没有关于SHA-1的实际攻击;对于密钥数据,很少需要超过160位散列码宽度)。 SHA-1的速度大约是MD5的一半。
当然,如果您使用MD5,则性能可能不应该成为太大问题。但显然这取决于您的数据大小。您可能会对我在Java中安全哈希函数的性能方面整理的一些信息感兴趣。
如果您确实需要更快的东西,并且只处理几百万个数据项,则可以考虑Numerical Recipes作者提出的64位哈希算法。
Java的标准hashCode()实现(例如String)可能不适合:除了任何关于哈希质量的问题之外,其32位宽度意味着您预计在仅处理大约16,000个数据项后就会发生碰撞。

2
我会支持Matt B的说法“不要在需要优化之前进行优化”。
然而,如果您决定需要比哈希码更多的东西……我使用消息摘要(在我的情况下是MD5)来“唯一”标识从RSS源下载的各种项目,以便我不会一遍又一遍地轮询同样的项目。这些通常是小型帖子,因此可以快速计算摘要。根据我的经验,这非常有效并且运行良好。
由于它们通常是单向函数,旨在对输入数据甚至非常小的更改做出强烈反应,因此使用MD5或SHA-1肯定不太可能发生碰撞。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接