String 字符串的统一16位哈希函数
我有大约50000个单词,我想把它们映射成一个16位的数字,我正在寻找一个在j2me上运行的哈希函数。 更具体地说,我正在寻找具有以下条件的哈希函数:String 字符串的统一16位哈希函数,string,java-me,hash,String,Java Me,Hash,我有大约50000个单词,我想把它们映射成一个16位的数字,我正在寻找一个在j2me上运行的哈希函数。 更具体地说,我正在寻找具有以下条件的哈希函数: 很少(或没有)碰撞 轻CPU负载 我现在有所有的单词了 雪崩效应并不重要,因为它与安全无关。这只是一张查表 我已经测试了java Strign.hashCode()、Murruld hash、jenkins,每次测试一个,还有一些简单的手工制作的,但它们都至少有30%的冲突。 对于小型手机来说,最小完美哈希似乎也有很重的CPU负载 有人能帮我吗
对于小型手机来说,最小完美哈希似乎也有很重的CPU负载 有人能帮我吗 注意:正如您所知,杂音算法需要一个种子,不同的种子具有不同的一致性。如何找到碰撞最少的种子
提前谢谢你你可以看看老式的。它们速度非常快,并且没有碰撞。只是不完全是16位,这似乎表明。尽管如此,你还是可以试一试,也许它对你的目的来说已经足够好了。这个答案可能会晚些给出,但作为参考,第三版的速度足以满足你的速度标准。但是,由于您施加的限制,冲突将非常常见,因为16位可以表示65536个值的范围,因此50000个字将产生一些冲突 解决方案:
- 使用20+位作为密钥(使用32位,几百万个样本中有一个冲突)
- 编写一个测试程序以找到适合16位的种子,以下是一些有用的工具:
- 这是我在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;
}
public static unsafe int get16bitshash(string str)
{
int hash=0;
int len=str.长度;
固定(char*ch=str)
{
对于(int i=0;i
其他数据结构是否适用于您?例如trie?您可能对此感兴趣:@Omri Barel:谢谢您的评论。我想尽量减少内存访问。我想如果我能找到一个好的哈希函数,它会更快,访问内存的次数也会更少。如果您返回数据类型int,这仍然返回32位号,而不是16?出于性能原因,最好使用32位整数执行计算。返回的32位整数只有低16位,其余高16位均为零。