3
int value = 5381;

for (int i = 0; i < item.length(); i++) {
  value = value * 33 + item.charAt(i);
}

value &= 0x7fffffff;
value %= size;

这是伯恩斯坦的哈希码。除了最后两行之外,我得到了所有内容。他们在做什么?它们还会在 Java 编译器中产生错误,因此它们显然不是有效代码。他们还能如何被代表?

我几乎不在乎他们做什么,只要他们工作哈哈:P

4

2 回答 2

7

按位和的目的&是将所有值转换为正整数范围。与简单的绝对值操作相比,这可能更好地保留了前操作创建的均匀分布。此外,正如@yshavit 在评论中指出的那样,摆脱负号的一般原因是,value最终可能会被用作某种索引。

取模的目的%是使哈希码适合有限大小的空间。

于 2013-04-03T00:16:07.547 回答
3

&是按位与,并且%是模数。

&=and%=显然是这些操作的简写和=.

于 2013-04-03T00:15:01.677 回答