所以我为这个算法做了一个散列码函数:
对于每个字符,将当前位向左旋转三位
加上每个字符的值,
将结果与当前
这是我目前掌握的代码:
unsigned int hash_function(const char *k){
unsigned int current = 0;
unsigned int rot = 0;
int i = 0;
int r = 0;
for(i = 0; i < strlen(k); i++){
for(r = 0; r < 3; r++){
rot = ((rot & 1 (1 << 31)) >> 31 | (rot << 1);
}
rot += k[i];
current ^= rot;
rot = current;
}
return current;
}
算法应该给出的一些例子
“给我”=477003,
“庇护所”=41540041
但是,这个算法没有给我正确的结果我很确定我使用的是正确的旋转操作,然后按原样执行算法我想知道是否有人能指点我正确的方向。
谢谢,希望我的问题格式正确
最佳答案
我想你是想放rot = ((rot & (1 << 31)) >> 31) | (rot << 1);
但循环是不必要的-请改用rot = ((rot & (7 << 29)) >> 29) | (rot << 3);
。
这应该有效:
unsigned int hash_function(const char *k){
unsigned int current = 0;
unsigned int rot = 0;
int i = 0;
for (i = 0; i < strlen(k); i++){
rot = ((rot & (7 << 29)) >> 29) | (rot << 3);
rot += k[i];
current ^= rot;
rot = current;
}
return current;
}