大家说说自己喜欢用的 计算hash值的函数

fx397993401 2012-02-05 01:07:45
我说说 我最近看的一个

这个函数 设计的时候是可以处理长度为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;


unsigned
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;
}

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;
}
...全文
142 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoweijq 2012-02-06
  • 打赏
  • 举报
回复
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;
}

另外记得笨狼兄什么时候发过一个很全的,忘记在哪了
求给出
fx397993401 2012-02-05
  • 打赏
  • 举报
回复
你的这个函数蛮好的
[Quote=引用 1 楼 thefirstz 的回复:]

试试这个:
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 cha……
[/Quote]
昵称很不好取 2012-02-05
  • 打赏
  • 举报
回复
试试这个:
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;
}

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧