1

寻找字符串到整数散列函数,其值在 mysqlbigint unsigned数据类型 ( 0 <= n <= 18446744073709551615) 的范围内。将 md5/sha1 转换为以 16 为底的整数不符合此要求。

4

1 回答 1

0

Java 使用了一个适合你的滚动哈希

来自java.lang.String

public int hashCode() {
    int h = hash;
    if (h == 0 && count > 0) {
        int off = offset;
        char val[] = value;
        int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}

这个想法是将哈希计算为:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

要处理溢出,您可以添加一个检查哈希的步骤,18446744073709551615如果它较大,则mod采用哈希和18446744073709551615.

于 2013-07-22T08:28:12.067 回答