【发布时间】: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,你希望每个副本都高效。