使用<<和>>>在哈希函数中

时间:2016-09-15 16:58:21

标签: java c hash hashcode

我在C中有一个项目,我需要为void指针创建一个合适的哈希函数,它可能包含字母数字字符,整数或只是简单的字符串。字符。

我需要使用多项式散列函数,而不是乘以常量,我应该使用部分和的循环移位固定的位数。 在此页面here ,有java代码(我假设这是java,因为使用了字符串):

static int hashCode(String s) {
  int h = 0;
  for (int i = 0; i < s.length(); i++) {
    h = (h << 5) | (h >>> 27); // 5-bit cyclic shift of the running sum
    h += (int) s.charAt(i); // add in next character
  }
  return h;
}

下面这行是什么?

h = (h << 5) | (h >>> 27); // 5-bit cyclic shift of the running sum

是的,评论说5位循环移位,但<<|>>>操作数在这方面如何运作?我以前从未见过或曾经使用过它们。

1 个答案:

答案 0 :(得分:3)

正如它所说,它是一个5位循环左移。这意味着所有位都向左移位,并且“向右移位”位被添加到右侧,五次。

代码将h的值替换为两个位模式的值。第一位模式是左移5位的原始值。第二个值是右移27位的原始值。

5位的左移将所有位置,但最左边的5位置于最终位置。最左边的5位被该移位“移出”,并用零替换为输出的最右边位。 27位的右移将最左边的5位作为最右边的位置放在它们的最终位置,最左边的27位移位为零。将它们组合在一起可产生所需的输出。

>>>是Java的unsigned班次操作。在C或C ++中,您只需使用>>