代码之家  ›  专栏  ›  技术社区  ›  huseyin tugrul buyukisik

对于短字符串,这是一个很好的哈希函数吗?

  •  -4
  • huseyin tugrul buyukisik  · 技术社区  · 6 年前

    对于10-50个字符的字符串:

    double hash(const std::string & str)
    {
        double result = 0;
        int n=str.length();
        for(int i=0;i<n;i++)
        {
            result += (str[i] - '@')*pow(256.0,i);
        }
        return result;
    }
    

    这可以在生产代码中使用吗?

    • 当与std::hash by ILP一起使用时,增加哈希的总吞吐量
    • 可扩展性

    按注释列出的新版本:

    double hash(const std::string & str)
    {
        double result = 0;
        int n=str.length();
    
        // maybe using multiple adders to do concurrently multiple chars
        // since they are not dependent
        for(int i=0;i<n;i++)
        {
            result += lookupCharDoubleType[str[i]]*lookupPow[i];
        }
        return result;
    }
    

    另一个版本的另一个评论:

    double hash(const std::string & str)
    {
        double result = 0;
        int n=str.length();
    
        for(int i=0;i<n;i++)
        {
            result = result * 256.0 + lookupCharDoubleType[str[i]];
        }
        return result;
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Caleb    6 年前

    对于短字符串,这是一个很好的哈希函数吗?

    不,这不是唯一性的好方法。 基本上就是把字符串映射到 double . 对于一个50个字符长的字符串,您将得到一个 256 ^^ 50 范围 双重的

    双重的

    绳子 hello 像这样的地图:

    'h' * 256^^0 + 'e'*256^^1 + 'l' * 256^^2 + 'l' * 256^^3 + 'o' * 256^^4
    

    双重的 无法精确地表示所有这些位。

    一个好的散列函数应该随时更改 任何