C#实现字符串Hash算法,BKDR_

Hash算法有很多种,在性能方面主要有以下两个指标:

(1) 散列分布性

即桶的使用率backet_usage = (已使用桶数) / (总的桶数),这个比例越高,说明分布性良好,是好的hash设计。

(2) 平均桶长

即avg_backet_len,所有已使用桶的平均长度。理想状态下这个值应该=1,越小说明冲突发生地越少,是好的hash设计。

hash函数计算一般都非常简洁,因此在耗费计算时间复杂性方面也都差异不大。

在对ASCII码字符串进行散列时,综合能力最好的就是BKDRHash算法和SDBMHash算法,

网上关于C#版本的BKDRHash算法很难找,所以我在这里分享一下:

BKDR Hash

public static int BKDRHash(this string str)
{
    int seed = 131; // 31 131 1313 13131 131313 etc..   
    int hash = 0;

    for (int i = 0; i < str.Length; i++)
    {
        hash = hash * seed + str[i];
    }

    return (hash & 0x7FFFFFFF);
}

你可能感兴趣的:(哈希算法,算法,hash)