1
查找字符串以整數散列函數的值在mysql bigint unsigned
數據類型(0 <= n <= 18446744073709551615
)範圍內。將md5/sha1轉換爲基數爲16的整數不符合此要求。128位整數散列函數
查找字符串以整數散列函數的值在mysql bigint unsigned
數據類型(0 <= n <= 18446744073709551615
)範圍內。將md5/sha1轉換爲基數爲16的整數不符合此要求。128位整數散列函數
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
。
你的散列函數需要什麼樣的屬性?它應該是密碼嗎?它需要快速嗎?我希望它需要在程序的不同執行過程中保持一致。 – user2357112
@ user2357112沒有加密。該值將用作字符串的整數鍵值。低碰撞要求是必須的。 –
實質上你需要一個64位散列。維基百科有一些被列爲64位的加密和非加密,包括RIPEMD-64,Siphash,elf64等。爲什麼這樣一個有限的散列大小呢? –