读书人

大伙儿说说自己喜欢用的 计算hash值的

发布时间: 2012-11-17 11:14:15 作者: rapoo

大家说说自己喜欢用的 计算hash值的函数
我说说 我最近看的一个

这个函数 设计的时候是可以处理长度为len 的数据,但是我测试了下 从0 开始遍历递增 ,到8192 就可以有冲突,
那么是不是可以理解为这个函数处理的 数据范围就是 8192 ?

欢迎大家提供我 更好的计算hash值 的资料

C/C++ code
cdb_hash(const void *buf, unsigned len){  register const unsigned char *p = (const unsigned char *)buf;  register const unsigned char *end = p + len;  register unsigned hash = 5381;    /* start value */  while (p < end)    hash = (hash + (hash << 5)) ^ *p++;  return hash;}


测试代码
C/C++ code
#include <iostream>#include <map>#include <vector>using namespace std;unsignedcdb_hash(const void *buf, unsigned len){  register const unsigned char *p = (const unsigned char *)buf;  register const unsigned char *end = p + len;  register unsigned hash = 5381;    /* start value */  while (p < end)    hash = (hash + (hash << 5)) ^ *p++;  return hash;}int main(){    map<int ,int> cdbmap;    cout << sizeof(int) / sizeof(char) << endl;    unsigned long a = 0 ;    unsigned long b = ~(0L);    cout << b;    for(; a <=b  ; a ++ )    {        //cout << a << "   "<< cdb_hash(&a,4) << endl;        unsigned t = cdb_hash(&a,4);        if( cdbmap.find(t)  == cdbmap.end())        {            cdbmap.insert(map<int,int>::value_type(t,a));        }        else        {            cout<< "有冲突" << a << endl; //这里就可以显示第一次冲突变量a的值            break ;        }    }    return 0;}


[解决办法]
试试这个:
C/C++ code
unsigned cdb_hash_2nd(const void *buf, unsigned len){    unsigned int b = 378551 ;    unsigned int a = 63689 ;    unsigned int hash = 0 ;    unsigned char *str = (unsigned char *)buf;    while (len)    {        hash = hash * a + (*str++ );        a *= b;        --len;    }    return hash;}
[解决办法]
java官方的
Java code
public int hashCode() {    int h = hash;        int len = count;    if (h == 0 && len > 0) {        int off = offset;        char val[] = value;            for (int i = 0; i < len; i++) {                h = 31*h + val[off++];            }            hash = h;        }        return h;    } 

读书人网 >软件架构设计

热点推荐