首页 > 代码库 > 【Todo】常见的哈希Hash算法

【Todo】常见的哈希Hash算法

参考 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算法