【问题标题】:Hash Code what Is this?哈希码这是什么?
【发布时间】:2013-03-24 11:50:43
【问题描述】:
int value = 5381;

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

value &= 0x7fffffff;
value %= size;

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

我几乎不在乎他们做什么,只要他们能工作就可以了:P

【问题讨论】:

  • 如果您不认识某个 Java 运算符,只需在 Google 中输入“Java 运算符”即可。
  • 编译(和运行)对我来说很好。当然,您必须将 item 定义为 String 并将 size 定义为 int。 item 是您要散列的字符串,size 是您将使用生成的 value 索引的散列表的大小。

标签: java arrays class hash


【解决方案1】:

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

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

【讨论】:

  • @user:因为您没有考虑two's-complement 的工作原理...
  • 试试这个:System.out.println(-10 &amp; 0x7FFFFFFF);
  • @user 不过,您应该在某个时候完成它。在你的编程生涯中,二的补码会一次又一次地出现。
  • 另外,@The111,重新使整数非负(非正)的目的,可能不仅仅是使 mod 函数分布更均匀。 mod 函数采用其第一个参数的符号 (jls 15.17.3),如果 value 将用作数组或列表的索引,那么重要的是它不是负数。
  • 另外,Math.abs(Integer.MIN_VALUE) 仍然是负数。 ;)
【解决方案2】:

&amp; 是按位与,% 是模数。

&amp;=%= 显然是这些操作和= 的简写。

【讨论】:

  • 它们不是= 的简写,x (op) y 实际上是 x = x (op) y` 的简写(或者至少如果你是使用自定义数据类型)
  • 嗯,嗯?这意味着int x=1; x + 1;int x=1; x=x+1; 的简写,这绝对不是真的。
猜你喜欢
  • 2011-06-04
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2013-08-26
  • 1970-01-01
  • 2014-12-22
相关资源
最近更新 更多