字符串怎生成hash值才能避免重复?(生成唯一ID)
人员的 识别码idCode 最长50个字符(字母和数字),用什么hash函数转成哈希值(唯一ID)且 基本不可能重复?
网上看到:
unsigned int hash(char *str)
{
register unsigned int h;
register unsigned char *p;
for(h = 0, p = (unsigned char *)str; *p ; p++)
h = 31 * h + *p;
return h;
}
但是感觉只用unsigned int ,很容易就溢出了。担心溢出之后,剩下的部分冲突率比较高
所以我改成unsigned long long, 哈希值的位数比unsigned int 宽了一倍。 冲突(重复的概率)是否可以忽略不计了?
unsigned long long hash(char *str)
{
unsigned long long h;
unsigned char *p;
for(h = 0, p = (unsigned char *)str; *p ; p++)
h = 31 * h + *p;
return h;
}
1 的重复率 和 2的重复率分别是多少? 能满足我们的唯一ID的需求吗?我们的用户数设计是10000人,条码是50个字母和数字组成的。