我在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位循环移位,但<<
,|
和>>>
操作数在这方面如何运作?我以前从未见过或曾经使用过它们。
答案 0 :(得分:3)
正如它所说,它是一个5位循环左移。这意味着所有位都向左移位,并且“向右移位”位被添加到右侧,五次。
代码将h
的值替换为两个位模式的值。第一位模式是左移5位的原始值。第二个值是右移27位的原始值。
5位的左移将所有位置,但最左边的5位置于最终位置。最左边的5位被该移位“移出”,并用零替换为输出的最右边位。 27位的右移将最左边的5位作为最右边的位置放在它们的最终位置,最左边的27位移位为零。将它们组合在一起可产生所需的输出。
>>>
是Java的unsigned班次操作。在C或C ++中,您只需使用>>
。