Java 散列码这是什么? int值=5381; 对于(int i=0;i
这是伯恩斯坦的散列码。除了最后两行,我什么都有。他们是干什么的?它们还会在Java编译器中产生错误,因此它们显然不是有效代码。除此之外,如何代表他们Java 散列码这是什么? int值=5381; 对于(int i=0;i,java,arrays,class,hash,Java,Arrays,Class,Hash,这是伯恩斯坦的散列码。除了最后两行,我什么都有。他们是干什么的?它们还会在Java编译器中产生错误,因此它们显然不是有效代码。除此之外,如何代表他们 我几乎不在乎它们做什么,只要它们能工作lol:p&是按位的,%是模 &=和%=显然是这些操作的简写,而=按位和&的目的是将所有值移到正整数范围内。这可能比简单的绝对值操作更好地保留由前一个操作创建的均匀分布。此外,正如@yshavit在评论中指出的那样,去掉负号的一般原因是值最终可能会被用作某种索引 模运算%的目的是使哈希代码适合有限大小的空间。如
我几乎不在乎它们做什么,只要它们能工作lol:p
&
是按位的,%
是模
&=
和%=
显然是这些操作的简写,而=
按位和&
的目的是将所有值移到正整数范围内。这可能比简单的绝对值操作更好地保留由前一个操作创建的均匀分布。此外,正如@yshavit在评论中指出的那样,去掉负号的一般原因是值
最终可能会被用作某种索引
模运算
%
的目的是使哈希代码适合有限大小的空间。如果有一个Java运算符您不认识,那么只需在Google中键入“Java运算符”。Conpiles(并运行)对我来说很好。当然,您必须将item
定义为字符串,将size
定义为int。item
是您正在散列的字符串,size
是您将使用结果值索引的哈希表的大小。@user:因为您没有考虑如何工作……请尝试以下操作:System.out.println(-10&0x7FFFFFFF);
@user尽管如此,你还是应该在某个时候仔细检查一下。在你的编程生涯中,2的补码会一次又一次地出现。此外,@111的目的是使整数非负(非正),这可能不仅仅是为了使mod函数更均匀地分布。mod函数采用其第一个参数(jls)的符号,如果value
将用作数组或列表的索引,那么重要的是它不是负的。此外,Math.abs(Integer.MIN_value)仍然是负的它们不是=
的简写,x(op)y
实际上是x=x(op)y`(或者至少在使用自定义数据类型时应该是)的简写,嗯?这意味着intx=1;x+1
是intx=1的缩写;x=x+1代码>这绝对不是真的。
int value = 5381;
for (int i = 0; i < item.length(); i++) {
value = value * 33 + item.charAt(i);
}
value &= 0x7fffffff;
value %= size;