所以我为这个算法做了一个散列码函数:
对于每个字符,将当前位向左旋转三位
加上每个字符的值,
将结果与当前
这是我目前掌握的代码:

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;
}

09-10 12:02