一个字符串的哈希函数

推荐网页:
云风的介绍Lua的.
一种对汉字更为环保的编码方案:不知道有没有人使用。

哈希函数一直对我来说都是比较神秘的东东,其实并不复杂,但是一个想要一个好的哈希函数不简单。

这个哈希函数,这是来自于云风的博客,来自于 Lua 的实现,说起他,一个人向中国推荐了 Lua 脚本,值得佩服。

unsigned long hash(const char* name, size_t len){
    unsigned long h = (unsigned long) len;
    size_t step = (len >> 5) + 1;
    for(size_t i = len; i >= step; i -= step)
        h = h ^ (h<<5) + (h>>2) + (unsigned long)name[i-1]
    return h;
}

云风: 一个方便的 hash 函数 应该散列的比较开(不要集中),哈希函数计算速度和字符串长度关系不大,又不能只计算字符串的开头和结尾。这个函数时从 Lua中看到的。

这个哈希值是 unsigned long 类型,如果你想要你的哈希值在一个范围之内,比如说10000。那么还应该 对值进行取模 hash(str) mod 10000

如何评价一个哈希函数的好坏(我自己的标准):
1. 哈希函数应该让值很分散,减少冲突 (如何证实呢?)
2. 哈希函数的计算速度,(和字符串的长度无关,并且又不能只利用字符串固定的一部分)
3. 整数值的哈希 和 字符串的哈希函数有区别吗? 标准库中的哈希函数时如何实现的?

你可能感兴趣的:(数据结构,算法)