几种hash函数的汇总
来源:互联网 发布:安装爱奇艺软件 编辑:程序博客网 时间:2024/05/18 12:01
翻帖子的时候无意间发现了几种hash函数,决定对其汇总一下。
ELFHASH,BKDRHash,SDBMHash,RSHash ,JSHash,PJWHash,DJBHash,APHash;
首先ELFhash。
ELFhash函数是对字符串的散列。它对于长字符串和短字符串都很有效,字符串中每个字符都有同样的作用,它巧妙地对字符的ASCII编码值进行计算,ELFhash函数对于能够比较均匀地把字符串分布在散列表中。具体做法是:将一个字符串的数组中的每个元素依次按前四位与上一个元素的低四位相与,组成一个长整形,如果长整的高四位大于零,那么就将它折回再与长整的低四位相异或,这样最后得到的长整对HASH表长取余,得到在HASH中的位置。
unsigned long elf_hash(const unsigned char *name)
{
unsigned long h = 0, g;
while (*name) {
h = (h << 4) + *name++;
if (g = h & 0xf0000000)
h ^= g >> 24;
h &= ~g;
}
return h;
}
BKDRHash。
unsigned int BKDRHash(char *str) { // BKDR Hash Function unsigned int seed = 131; // 31 131 1313 13131 131313 etc.. unsigned int hash = 0; while (*str) { hash = hash * seed + (*str++); } return (hash & 0x7FFFFFFF); }
SDBMHash。
unsigned int SDBMHash(char *str){unsigned int hash = 0; while (*str){// equivalent to: hash = 65599*hash + (*str++);hash = (*str++) + (hash << 6) + (hash << 16) - hash;} return (hash & 0x7FFFFFFF);}
RShash。
unsigned int RSHash(char *str){unsigned int b = 378551;unsigned int a = 63689;unsigned int hash = 0; while (*str){hash = hash * a + (*str++);a *= b;} return (hash & 0x7FFFFFFF);}
JS Hash。
unsigned int JSHash(char *str){unsigned int hash = 1315423911; while (*str){hash ^= ((hash << 5) + (*str++) + (hash >> 2));} return (hash & 0x7FFFFFFF);}
PJhash。
unsigned int PJWHash(char *str){unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);unsigned int ThreeQuarters= (unsigned int)((BitsInUnignedInt * 3) / 4);unsigned int OneEighth= (unsigned int)(BitsInUnignedInt / 8);unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);unsigned int hash = 0;unsigned int test = 0; while (*str){hash = (hash << OneEighth) + (*str++);if ((test = hash & HighBits) != 0){hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));}} return (hash & 0x7FFFFFFF);}
DJhash。
unsigned int DJBHash(char *str){unsigned int hash = 5381; while (*str){hash += (hash << 5) + (*str++);} return (hash & 0x7FFFFFFF);}
APhash。
unsigned int APHash(char *str){unsigned int hash = 0;int i; for (i=0; *str; i++){if ((i & 1) == 0){hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));}else{hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));}} return (hash & 0x7FFFFFFF);}
呵呵 水平有限欢迎大家批评,需要使用hash函数时应该根据相应的领域进行测试吧。好像没有所有都非常适用的吧。
- 几种hash函数的汇总
- hash函数的几种
- 几种流行的hash函数
- 有效的Hash函数汇总
- 几种HASH函数在POJ2503上的时间比较
- HASH函数及解决冲突的几种方法
- 几种经典的Hash算法实现
- 几种经典的hash算法
- 几种经典的字符串hash算法
- 几种经典的hash算法
- 解决Hash冲突的几种方法
- 几种经典的hash算法
- 几种经典的hash算法
- 几种经典的hash算法
- 几种经典的hash算法
- 几种常用的hash算法
- 解决Hash冲突的几种方法
- 关于Hash的几种常用算法
- javaScript正则表达式
- 十个有效的企业用人建议
- sql左连接
- SqlServer修改当前实例为默认实例
- 山东理工ACM 2116 顺序建链表
- 几种hash函数的汇总
- 是小日本要求严了,还是其他公司不严谨?
- 求教一个生产者消费者问题
- 第一篇
- I'M 菜鸟 多多关照
- POJ 1221 dp
- 搭建Android开发环境
- 使用c#解压缩zip文件
- 山东理工ACM 2117 逆序建立链表