我有大约50,000个单词,我想将它们映射到16位数字,我正在寻找在j2me上运行的散列函数。 更具体地说,我正在寻找具有以下标准的哈希函数:
我已经测试过java Strign.hashCode(),murmur hash,jenkins,一次只有几个简单的手工制作,但是所有这些都有至少30%的碰撞。
对于小型手机来说,最小的完美散列似乎也有很大的CPU负载。
有人可以帮我吗?
注意:如你所知,杂音算法需要种子,不同的种子有不同的均匀度。如何找到碰撞最少的种子?提前谢谢
答案 0 :(得分:0)
你可以看一下老式的CRC。它们非常快速且无碰撞。只是不完全是16位,因为experiment似乎表明了这一点。但是,你可以尝试一下,也许这对你的目的来说已经足够了。
答案 1 :(得分:0)
这个答案可能会迟到,但作为参考,MurmurHash 3足以满足您的速度标准。但是由于你施加的约束,碰撞将非常普遍,因为16位可以表示65536个值的范围,你的50000个单词会产生一些碰撞。
解决方案:
答案 2 :(得分:0)
这是我在C#中使用的函数将文件名映射到16位数。在我的测试中,它的性能优于Pearson哈希。
public static unsafe int Get16BitHash(string str)
{
int hash = 0;
int len = str.Length;
fixed (char* ch = str)
{
for (int i = 0; i < len; i++)
{
hash = hash + ((hash) << 5) + *(ch + i) + ((*(ch + i)) << 7);
}
}
return ((hash) ^ (hash >> 16)) & 0xffff;
}