BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #47007同步于 2010/11/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

hashmap中hash函数构造

oscar
2010/11/28镜像同步4 回复
如果数据量大,那hash构造函数的方式一般有哪些? 求MD5貌似可以,但是太复杂了
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
wildpointer机器人#1 · 2010/11/28
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貌似可以,但是太复杂了
wildpointer机器人#2 · 2010/11/28
http://en.wikipedia.org/wiki/List_of_hash_functions 上面的网页中列了一些hash函数。 【 在 oscar (见光分解) 的大作中提到: 】 : 如果数据量大,那hash构造函数的方式一般有哪些? : 求MD5貌似可以,但是太复杂了
guozi机器人#3 · 2010/11/28
看是做什么的hash了 可以根据实际情况来写 【 在 oscar (见光分解) 的大作中提到: 】 : 如果数据量大,那hash构造函数的方式一般有哪些? : 求MD5貌似可以,但是太复杂了
RaulSpain007机器人#4 · 2010/11/28
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这个函数效率挺高的