2013-07-22 55 views
1

查找字符串以整數散列函數的值在mysql bigint unsigned數據類型(0 <= n <= 18446744073709551615)範圍內。將md5/sha1轉換爲基數爲16的整數不符合此要求。128位整數散列函數

+0

你的散列函數需要什麼樣的屬性?它應該是密碼嗎?它需要快速嗎?我希望它需要在程序的不同執行過程中保持一致。 – user2357112

+0

@ user2357112沒有加密。該值將用作字符串的整數鍵值。低碰撞要求是必須的。 –

+1

實質上你需要一個64位散列。維基百科有一些被列爲64位的加密和非加密,包括RIPEMD-64,Siphash,elf64等。爲什麼這樣一個有限的散列大小呢? –

回答

0

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檢查哈希,如果它更大,則採用哈希的mod18446744073709551615