返回信息流如果数据量大,那hash构造函数的方式一般有哪些?
求MD5貌似可以,但是太复杂了
这是一条镜像帖。来源:北邮人论坛 / cpp / #47007同步于 2010/11/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
hashmap中hash函数构造
oscar
2010/11/28镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
hashCode很多时候都是自己实现的。并不是MD5.
举例:
在java语言的String类的hashcode就是下面一个函数:
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;
}
上面的函数的细节先不管(因为这是C/C++版),注意一下那个for循环,把串中的函数每
个元素都处理一遍。
用C语言重写它这个函数,应该和下面的差不多
int hash_code(char *str)
{
int h = 0;
while(*str != '\0')
{
h = 31*h + *str;
str++;
}
return h;
}
============================
还有另外一些的hashCode。比如java语言中的Float类的hashCode,就是直接返回float
的比特模式对应的int值。
【 在 oscar (见光分解) 的大作中提到: 】
: 如果数据量大,那hash构造函数的方式一般有哪些?
: 求MD5貌似可以,但是太复杂了
http://en.wikipedia.org/wiki/List_of_hash_functions
上面的网页中列了一些hash函数。
【 在 oscar (见光分解) 的大作中提到: 】
: 如果数据量大,那hash构造函数的方式一般有哪些?
: 求MD5貌似可以,但是太复杂了
看是做什么的hash了
可以根据实际情况来写
【 在 oscar (见光分解) 的大作中提到: 】
: 如果数据量大,那hash构造函数的方式一般有哪些?
: 求MD5貌似可以,但是太复杂了
unsigned int SDBMHash(char *str)
{
unsigned int hash = 0;
while (*str)
{
// equivalent to: hash = 65599*hash + (*str++);
hash = (*str++) + (hash << 6) + (hash << 16) - hash;
}
return (hash & 0x7FFFFFFF);
}
// RS Hash Function
unsigned int RSHash(char *str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;
while (*str)
{
hash = hash * a + (*str++);
a *= b;
}
return (hash & 0x7FFFFFFF);
}
// JS Hash Function
unsigned int JSHash(char *str)
{
unsigned int hash = 1315423911;
while (*str)
{
hash ^= ((hash << 5) + (*str++) + (hash >> 2));
}
return (hash & 0x7FFFFFFF);
}
// P. J. Weinberger Hash Function
unsigned int PJWHash(char *str)
{
unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
unsigned int ThreeQuarters = (unsigned int)((BitsInUnignedInt * 3) / 4);
unsigned int OneEighth = (unsigned int)(BitsInUnignedInt / 8);
unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);
unsigned int hash = 0;
unsigned int test = 0;
while (*str)
{
hash = (hash << OneEighth) + (*str++);
if ((test = hash & HighBits) != 0)
{
hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
}
return (hash & 0x7FFFFFFF);
}
// ELF Hash Function
unsigned int ELFHash(char *str)
{
unsigned int hash = 0;
unsigned int x = 0;
while (*str)
{
hash = (hash << 4) + (*str++);
if ((x = hash & 0xF0000000L) != 0)
{
hash ^= (x >> 24);
hash &= ~x;
}
}
return (hash & 0x7FFFFFFF);
}
// BKDR Hash Function
unsigned int BKDRHash(char *str)
{
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
unsigned int hash = 0;
while (*str)
{
hash = hash * seed + (*str++);
}
return (hash & 0x7FFFFFFF);
}
// DJB Hash Function
unsigned int DJBHash(char *str)
{
unsigned int hash = 5381;
while (*str)
{
hash += (hash << 5) + (*str++);
}
return (hash & 0x7FFFFFFF);
}
// AP Hash Function
unsigned int APHash(char *str)
{
unsigned int hash = 0;
int i;
for (i=0; *str; i++)
{
if ((i & 1) == 0)
{
hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
}
else
{
hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
}
}
return (hash & 0x7FFFFFFF);
}
貌似都是工业上用的吧....只在做ACM题的时候用过...效率依次递减 SDBMHash这个函数效率挺高的