String 字符串的哈希函数

String 字符串的哈希函数,string,algorithm,hash,String,Algorithm,Hash,我需要一个哈希函数来表示 具有低碰撞率(即使对于短字符串) 可以快速计算(O(n)时间是必须的,但我希望它尽可能快) 给定hash(string1)和hash(string2),计算hash(append(string1,string2)) 可以在O(1)中完成 到目前为止,我能想到的最好的方法是:(在Java伪代码中) public static int[]HASH_ENTROPY=new int[]{…}//255个大素数 公共整数散列() int hash=0; for(int i=0;i

我需要一个哈希函数来表示

  • 具有低碰撞率(即使对于短字符串)

  • 可以快速计算(
    O(n)
    时间是必须的,但我希望它尽可能快)

  • 给定
    hash(string1)
    hash(string2)
    ,计算
    hash(append(string1,string2))
    可以在
    O(1)
    中完成

  • 到目前为止,我能想到的最好的方法是:(在Java伪代码中)

    public static int[]HASH_ENTROPY=new int[]{…}//255个大素数
    公共整数散列()
    int hash=0;
    for(int i=0;i
    有更好的算法吗?这一个在#1和#3中表现很好,但我想知道 如果访问数组中的随机元素太慢。

    我建议您使用:

    public uint32_t hash()
        uint32_t hash = 0x1f351f35; // 2x Barker code
        for (int i=0; i < this.array.length; i++) {
           char c = this.array[i];
           hash = ((hash << 1) | (hash >> 31)) + (HASH_ENTROPY[(uint8_t)(hash + c)] ^ c);
        }
        return hash;
    
    public uint32\u t hash()
    uint32\u t hash=0x1f351f35;//2x巴克码
    for(int i=0;i31))+(hash_熵[(uint8_t)(hash+c)]^c);
    }
    返回散列;
    
    我建议您使用:

    public uint32_t hash()
        uint32_t hash = 0x1f351f35; // 2x Barker code
        for (int i=0; i < this.array.length; i++) {
           char c = this.array[i];
           hash = ((hash << 1) | (hash >> 31)) + (HASH_ENTROPY[(uint8_t)(hash + c)] ^ c);
        }
        return hash;
    
    public uint32\u t hash()
    uint32\u t hash=0x1f351f35;//2x巴克码
    for(int i=0;i31))+(hash_熵[(uint8_t)(hash+c)]^c);
    }
    返回散列;
    
    < /代码> ,如果需要快速计算时间,可以考虑另一个散列函数:

    public uint32_t hash()
        uint32_t hash = 0x1f351f35; // 2x Barker code
        for (int i=0; i < this.array.length; i++) {
           hash += (hash << 4) + this.array[i];
        }
        return hash;
    
    public uint32\u t hash()
    uint32\u t hash=0x1f351f35;//2x巴克码
    for(int i=0;ihash=(hash ),如果需要快速计算时间,可以考虑另一个散列函数:

    public uint32_t hash()
        uint32_t hash = 0x1f351f35; // 2x Barker code
        for (int i=0; i < this.array.length; i++) {
           hash += (hash << 4) + this.array[i];
        }
        return hash;
    
    public uint32\u t hash()
    uint32\u t hash=0x1f351f35;//2x巴克码
    for(int i=0;ihash+=(hash这与RSA和其他类似的方法没有什么不同,而不仅仅是“大”素数,你可以使用对很多事情都相对素数的素数(如3、17等)。我知道Ramanujan也提出了一个非常好的散列数(我想都想不到)该算法是顺序无关的,这意味着字谜将发生冲突;这似乎与欲望1相矛盾,尽管使用顺序相关的散列算法使欲望3变得如此之快很难。我真的不认为查找熵值的速度很重要,但另一方面,它们对你也没有多大帮助。@nikdepen For您使用哈希(安全或查找)的目的是什么?所需的哈希键长度是多少?@VikramBhat不是安全性,只是哈希映射lookup@rici字谜在应用程序中很少出现,所以我不担心它们。这与RSA和其他类似的方法没有什么不同,而不仅仅是“大”素数,您可以使用对很多事物都相对素数的素数(即3、17等)我知道Ramanujan也提出了一个非常好的散列数字(我想不起来了)该算法是顺序无关的,这意味着字谜将发生冲突;这似乎与欲望1相矛盾,尽管使用顺序相关的散列算法使欲望3变得如此之快很难。我真的不认为查找熵值的速度很重要,但另一方面,它们对你也没有多大帮助。@nikdepen For您使用哈希(安全或查找)的目的是什么?所需的哈希键长度是多少?@VikramBhat不是安全性,只是哈希映射lookup@rici字谜在应用程序中很少出现,所以我不担心它们。这很好,但比我给出的要慢4-5倍。使用此函数有什么实质性的好处吗?好处-可抵抗字谜哈希(“ab”)!=哈希(“ba”);雪崩效应,当输入数据中的更改1位会更改输出数据中约50%的位时。您将如何操作:给定
    hash(string1)
    hash(string2)
    ,计算
    hash(append(string1,string2))
    可以在O(1)中完成。这很好,但速度比我给出的慢4-5倍。使用此函数有什么实质性的好处吗?好处-可抵抗字谜散列(“ab”)!=散列(“ba”);当输入数据中的更改1位会改变输出数据中约50%的位时,会产生雪崩效应。您将如何做:给定
    散列(string1)
    散列(string2)
    ,计算
    散列(append(string1,string2))
    可以在O(1)中完成?