String 字符串的统一16位哈希函数

String 字符串的统一16位哈希函数,string,java-me,hash,String,Java Me,Hash,我有大约50000个单词,我想把它们映射成一个16位的数字,我正在寻找一个在j2me上运行的哈希函数。 更具体地说,我正在寻找具有以下条件的哈希函数: 很少(或没有)碰撞 轻CPU负载 我现在有所有的单词了 雪崩效应并不重要,因为它与安全无关。这只是一张查表 我已经测试了java Strign.hashCode()、Murruld hash、jenkins,每次测试一个,还有一些简单的手工制作的,但它们都至少有30%的冲突。 对于小型手机来说,最小完美哈希似乎也有很重的CPU负载 有人能帮我吗

我有大约50000个单词,我想把它们映射成一个16位的数字,我正在寻找一个在j2me上运行的哈希函数。 更具体地说,我正在寻找具有以下条件的哈希函数:

  • 很少(或没有)碰撞
  • 轻CPU负载
  • 我现在有所有的单词了
  • 雪崩效应并不重要,因为它与安全无关。这只是一张查表
  • 我已经测试了java Strign.hashCode()、Murruld hash、jenkins,每次测试一个,还有一些简单的手工制作的,但它们都至少有30%的冲突。
    对于小型手机来说,最小完美哈希似乎也有很重的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位均为零。