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

问题是什么是最好的?(性能和碰撞之间的折衷......)。

一方面,我有一个基于各个字段的值的常规 hashCode 函数(遵循第 3 章) 有效的Java. 。但我无法评估这种方法所带来的潜在冲突。

另一方面,我有来自标准 java 发行版的带有 SHA-1 算法的 MessageDigest 方法。我认为这不会有效,但我可能会减少碰撞。我对吗 ?在我的上下文中这是正确的解决方案还是我完全错误?

问题是我不知道物体的大小是多少。另请注意,计算出的值不会在哈希表中使用。

谢谢...

有帮助吗?

解决方案

请参阅以下内容:

请记住以下几点:

  • 一个对象可能不相等,但具有相同的哈希码
  • 您的碰撞可能性取决于您遇到的物体数量。
  • 哈希码的有用程度取决于您如何实施检查

一般来说,您可以根据预期对象的数量和可能的散列数(最大散列值)来确定碰撞的机会。看 http://en.wikipedia.org/wiki/Birthday_paradox 详细解释。

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

其他提示

个人,直到它已经证明,任何可能的冲突是避免先发制人优化,你可能没有真正有问题的实际问题,我会用hashCode()的对象。

由于生日的问题,一个碰撞的机会取决于你有多少项目有工作。

SHA-1的160位的空间是如此之大,我怀疑你所能拥有足够的项目看碰撞。

hashCode()的32位空间应该不会有冲突的显著数量,直到你拥有超过50,000项。然而,这依赖于使用良好散列算法。

为了应用加密摘要像SHA-1,您需要将您的图形转换为字节的字符串,这很可能是计算昂贵的,并且可能是复杂的。

一般重复文件/数据检测,MD5是速度和碰撞的机会之间的良好折衷。 MD5是不适当的,如果有人可能故意起草文件来欺骗你的程序(它是稍微容易受到碰撞攻击)。但如果你只是担心偶然的碰撞,那么它的128位宽度实际上总是足够的目前。

SHA-1和SHA-256让您对故意碰撞攻击的一些保护(与SHA-1是已知的理论,但没有实际的攻击;对于键控数据,这是很不值得去博扬160位的散列码宽度)。 SHA-1是大致MD5的速度的一半。

当然,如果你使用MD5,性能可能不应该是太大的问题的。但显然这并不取决于你的数据的大小。您可能感兴趣的一些信息,我放在一起关于安全散列函数效果在Java的。

如果你真的需要的东西更快,你只处理几百万个数据,那么另一个选择要考虑的是由数字食谱作者提出64位的散列算法。

Java的标准的hashCode()实现(的,比方说,字符串)可能是不适合:除了对散列的任何质量问题,其32位的宽度是指,你会想到经过短短16000项或碰撞如此。

我会赞同马特B的说:“你需要优化之前不要优化。”

不过,如果你决定你需要比哈希码的道路更多的东西......我用消息摘要(MD5在我的情况),以“唯一”识别从RSS下载各种项目结转,因此我最终没有同一项目多次出现在列表中,我调查了个遍。这些都是典型的小帖子这样的摘要可以快速计算。在我的经验,这是非常有效的,效果不错。

由于他们通常是指反应强烈,即使在输入数据非常小的变化单向函数,你肯定是不太可能得到碰撞与MD5或SHA-1。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top