码迷,mamicode.com
首页 > 编程语言 > 详细

【Todo】常见的哈希Hash算法

时间:2016-12-04 07:47:30      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:算法实现   运算   return   span   地址   常见   charles   veh   ret   

参考 Link

 

另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/charlesblc/p/5990475.html

DJB的算法实现核心是通过给哈希值(Key)乘以33(即左移5位再加上哈希值)计算哈希值

Zend HashTable的哈希算法异常简单:hashKey = key & nTableMask;
概况来说只要保证后16位均为0,则与掩码位于后得到的哈希值全部碰撞在位置0。

一 加法Hash

所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。
标准的加法Hash的构造如下:

static int additiveHash(String key, int prime)
{

int hash, i;
for (hash = key.length(), i = 0; i < key.length(); i++)
hash += key.charAt(i);
return (hash % prime);
}
这里的prime是任意的质数,看得出,结果的值域为[0,prime-1]。

 

二 位运算Hash

这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素。比如,标准的旋转Hash的构造如下:

static int rotatingHash(String key, int prime)

{

    int hash, i;

    for (hash=key.length(), i=0; i<key.length(); ++i)

        hash = (hash<<4)^(hash>>28)^key.charAt(i);

    return (hash % prime);

}

 

 

碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法。

 

【Todo】常见的哈希Hash算法

标签:算法实现   运算   return   span   地址   常见   charles   veh   ret   

原文地址:http://www.cnblogs.com/charlesblc/p/6130141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!