大家说说自己喜欢用的 计算hash值的函数
我说说 我最近看的一个
这个函数 设计的时候是可以处理长度为len 的数据,但是我测试了下 从0 开始遍历递增 ,到8192 就可以有冲突,
那么是不是可以理解为这个函数处理的 数据范围就是 8192 ?
欢迎大家提供我 更好的计算hash值 的资料
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;}#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;}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官方的
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; }