Hash学习(2)-Hash函数
来源:互联网 发布:dijkstra算法证明 编辑:程序博客网 时间:2024/06/09 08:00
一个好的hash函数一般具有以下两个特点:第一,速度快,第二,能够将散列键均匀的分布在整个表中,保证不会产生聚集。通常,hash函数具有如下形式:
hash-key = calculated-key % tablesize
上一节主要讨论了一下tablesize,为了提高散列键的离散程度,tablesize通常取素数。一般而言,没有绝对好的hash函数,hash函数的好坏很大程度上依赖于输入键的结构,人们讨论的最多的一般都是输入键为普通字符串的情况。这里也以字符串为例讨论如何一步步优化hash函数。
当键是字符串时,一种选择策略是简单的将字符串中每个字符的ASCII码加起来,代码如下:
- unsigned int hash(const char *key, unsigned int tableSize)
- {
- unsigned int hashVal;
- while(*key != '\0')
- hashVal += *key++;
- return (hashVal % tableSize);
- }
下面的hash函数对针对上面的缺点进行了改进。
- unsigned int hash(const char *key, unsigned int tableSize)
- {
- return (key[0] + 27*key[1] + 729*key[2]) % tableSize;
- }
针对以上缺点,进一步改进:
- unsigned int hash(const char *key,unsigned int tableSize)
- {
- unsigned int hashVal;
- while(*key != '\0')
- hashVal = (hashVal << 5) + *key++;
- return (hashVal % tableSize);
- }
在计算该值时,利用了Horner法则,例如计算 hash=a+32b+32*32c 的另一种方式是借助公式:hash=((c)*32+b)*32+a。Horner法则将其扩展到用于n次多项式。该算法通过将乘法运算转换为位运算保证了hash函数快速的特点。
下面给出实际字符串hash应用中使用的很广的一个hash函数:ELFhash
- unsigned long ELfHash(const unsigned char * key)
- {
- unsigned long h = 0, g;
- while(*key)
- {
- h = (h << 4) + *key++;//把h左移4位加上该字符赋给h
- if(g = h & 0xF0000000)//取h的高四位赋给g
- h ^= g >> 24;//如果g不为0,让h和g的高八位异或再赋给h
- h &= ~g;//对g取反并与h相与赋给h
- }
- return h;
- }
http://blog.csdn.net/qll125596718/article/details/7005369
0 0
- Hash学习(2)-Hash函数
- Hash学习(2)-Hash函数
- Hash函数学习笔记
- 【学习笔记】hash表和hash函数
- Hash 函数、Hash表
- HASH(哈希表)学习
- hash函数
- hash函数
- hash函数
- hash函数
- Hash函数
- Hash函数
- Hash函数
- hash函数
- hash函数
- Hash函数
- hash函数
- Hash函数
- tableView的组顶部视图和底部视图跟随tableView滑动
- Hash学习(1)-Hash表的表大小
- J2EE中各种对象让人眼花缭乱的专业缩略词
- 一些常用代码编辑工具的使用技巧小结
- iOS之UIPickerView的使用--多列选择器
- Hash学习(2)-Hash函数
- 2015年信息通信网络技术展望
- 正则表达式的符号详解
- IOS切图规范
- 企业部署虚拟化的七大好处
- Linux系统调用
- iOS-Core-Animation-Advanced-Techniques
- sqlplus中超级好用的小命令
- 数据在Access与Office组件之间如何自由流动