【问题标题】:java string hash function with avalanche effect具有雪崩效应的java字符串散列函数
【发布时间】:2011-02-16 04:05:29
【问题描述】:

在使用 String.hashCode() 进行测试时,我注意到它没有 avalanche effect。我知道有一个Jenkins hash 的java 端口,但我想知道是否有一个哈希函数,可能在某个apache 库或其他东西中,它具有这个属性。

编辑:我正在寻找一个展示此属性的函数,并返回一个 32 位(或 64 位)整数(例如,像 Jenkins 哈希)。我没有将它用于密码学,而且我一般不打算替换 String.hashCode。我只是认为 hashCode 有这个属性,但事实证明它没有,我想知道 java 的标准库或 apache 库中是否有任何东西可以满足我的需要。

【问题讨论】:

  • hashCode 函数只处理相等/不相等。这里不需要你想到的属性。
  • 我不太确定这是否会对您有所帮助,但 Apache Hadoop 有一个 Jenkins 和 Murmur 哈希实现,只需 google 类。
  • hashCode() 旨在简化和快速用于 Hashtable/HashMap 等。它还针对 ASCII 文本进行了优化。 (即使用大于字符数的 31 的素数乘数)由于大多数哈希映射都很小,因此并非所有 32 位都需要翻转以产生良好的哈希值分布。
  • @Peter Lawrey:所有数据结构在很小的时候性能都很好。 HashMap 的卖点是当它很大时性能是平均情况 O(1)。为什么 Java 设计人员会(或确实)针对似乎无关紧要的情况进行优化?
  • 因为 big-O 不考虑常数,也不认为这是一个可能多次发生的操作。例如假设你要复制一个 HashMap,你希望每个副本都高效。

标签: java hash hashcode


【解决方案1】:

如您链接到的维基百科页面中所述,雪崩效应是加密哈希函数的一个重要属性。 String.hashCode() 不是加密哈希函数。它的唯一目标是为不同的字符串生成足够分布的哈希码,以便 HashMap、HashSet 和所有其他基于哈希的集合在保存字符串时高效。

对于加密哈希函数,请查看JCA,它允许生成 SHA-1、MD5 和其他加密摘要,它们都具有您正在寻找的效果。

【讨论】:

  • 我想我应该更清楚。我想要一个返回 32 位整数并表现出雪崩效应的字符串的哈希函数。我没有将它用于哈希表。
  • 使用现有的加密函数,将结果转换为字符串,并在字符串上调用 hashcode()。
  • 我认为雪崩是任何好的散列函数的重要属性。例如,如果我在 HashMap 中存储值并且许多键是相似的(“k1”、“k2”、“k3”、“k4”),它们最终会被不均匀地存储(实际上是连续的)。结果是更有可能发生冲突,从而降低性能。正因为如此,我很惊讶 java 没有提供更好的默认 hashCode 方法。还是我错过了什么?我确信 java 的设计者有一个很好的理由,但我就是不明白。
  • @Kevin:不,avlanche 属性不是任何好的散列函数的重要属性,不,如果相似的键相邻存储,冲突的可能性不会
猜你喜欢
  • 1970-01-01
  • 2014-10-21
  • 2013-11-16
  • 2011-02-07
  • 2011-04-11
  • 2010-09-15
  • 2017-08-20
  • 2015-09-07
  • 2011-12-22
相关资源
最近更新 更多