FNV算法中,32位和64位的位数长度不一致吗?
今天在找一个HASH算法,能够自动生成二进制的长度位数是32或64的。以前听说过FNV算法,我以为它32bit和64bit生成的二进制位数会是32或64,但测试下来并不是这样。下面一段32位的代码
def FNVHash(key):
fnv_prime = 16777619
hash = 2166136261
for i in range(len(key)):
hash *= fnv_prime
hash ^= ord(key[i])
return hash
测试 'abcd'字符串二进制位数只有28,难道还要我补上四个0么。同样的,64bit也不是64的长度。这样下来,我是不是可以理解成 FVN输出的结果只是32位的数字和64的数字,跟位数的长度并有任何关系?
下面是网上一段32位的HASH函数
public static int hash32shift(int key)
{
key = ~key + (key << 15); // key = (key << 15) - key - 1;
key = key ^ (int)((uint)key >> 12);
key = key + (key << 2);
key = key ^ (int)((uint)key >> 4);
key = key * 2057; // key = (key + (key << 3)) + (key << 11);
key = key ^ (int)((uint)key >> 16);
return key;
}
上面可以生成32位的hash,是不是?