Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
int value = 5381; for (int i = 0; i < item.length(); i++) { value = value * 33 + item.charAt(i); } value &= 0x7fffffff; value %= size;
这是伯恩斯坦的哈希码。除了最后两行之外,我得到了所有内容。他们在做什么?它们还会在 Java 编译器中产生错误,因此它们显然不是有效代码。他们还能如何被代表?
我几乎不在乎他们做什么,只要他们工作哈哈:P
按位和的目的&是将所有值转换为正整数范围。与简单的绝对值操作相比,这可能更好地保留了前操作创建的均匀分布。此外,正如@yshavit 在评论中指出的那样,摆脱负号的一般原因是,value最终可能会被用作某种索引。
&
value
取模的目的%是使哈希码适合有限大小的空间。
%
&是按位与,并且%是模数。
&=and%=显然是这些操作的简写和=.
&=
%=
=