2013-07-22 52 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