字符串的统一16位散列函数

时间:2011-08-20 06:02:04

标签: string java-me hash

我有大约50,000个单词,我想将它们映射到16位数字,我正在寻找在j2me上运行的散列函数。 更具体地说,我正在寻找具有以下标准的哈希函数:

  1. 很少(或没有)碰撞
  2. 轻量CPU负载
  3. 我现在有了所有的话
  4. 雪崩效应很重要,因为它与安全无关。它只是一个查找表。
  5. 我已经测试过java Strign.hashCode(),murmur hash,jenkins,一次只有几个简单的手工制作,但是所有这些都有至少30%的碰撞。
    对于小型手机来说,最小的完美散列似乎也有很大的CPU负载。

    有人可以帮我吗?

    注意:如你所知,杂音算法需要种子,不同的种子有不同的均匀度。如何找到碰撞最少的种子?

    提前谢谢

3 个答案:

答案 0 :(得分:0)

你可以看一下老式的CRC。它们非常快速且无碰撞。只是不完全是16位,因为experiment似乎表明了这一点。但是,你可以尝试一下,也许这对你的目的来说已经足够了。

答案 1 :(得分:0)

这个答案可能会迟到,但作为参考,MurmurHash 3足以满足您的速度标准。但是由于你施加的约束,碰撞将非常普遍,因为16位可以表示65536个值的范围,你的50000个单词会产生一些碰撞。

解决方案:

  • 使用20+位作为密钥(32位,几百万个样本中有一个冲突)
  • 编写测试程序以找到16位的拟合种子,这里有一些有用的工具:http://code.google.com/p/smhasher/

答案 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;
    }