寻找一个字符串到整数散列函数,其值在 mysql bigint unsigned
范围内数据类型(0 <= n <= 18446744073709551615
)。将 md5/sha1 转换为以 16 为底的整数不符合此要求。
最佳答案
Java 使用 rolling hash那应该适合你
来自 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
。
关于python - 128 位整数哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17782744/