hash function比较
http://blog.csdn.net/kingstar158/article/details/8028635
由于工作需要,针对千万级别的数据,使用stl::map着实存在着效率问题,最后使用boost::unordered_map替代前者,发现效率上有很大的提升,但是还是无法达到我们的需求;
stl::map 底层算法:B+tree 实现
boost::unordered_map 底层算法:hash 实现
所以可能要针对不同的数据类型编写hash function来优化查找和插入的效率,自己编写,着实没有这个实力,只有在google上来寻找先辈们的精妙算法来借鉴:
常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等;
有前辈做了评测:如下
| ash函数 | 数据1 | 数据2 | 数据3 | 数据4 | 数据1得分 | 数据2得分 | 数据3得分 | 数据4得分 | 平均分 |
| BKDRHash | 2 | 0 | 4774 | 481 | 96.55 | 100 | 90.95 | 82.05 | 92.64 |
| APHash | 2 | 3 | 4754 | 493 | 96.55 | 88.46 | 100 | 51.28 | 86.28 |
| DJBHash | 2 | 2 | 4975 | 474 | 96.55 | 92.31 | 0 | 100 | 83.43 |
| JSHash | 1 | 4 | 4761 | 506 | 100 | 84.62 | 96.83 | 17.95 | 81.94 |
| RSHash | 1 | 0 | 4861 | 505 | 100 | 100 | 51.58 | 20.51 | 75.96 |
| SDBMHash | 3 | 2 | 4849 | 504 | 93.1 | 92.31 | 57.01 | 23.08 | 72.41 |
| PJWHash | 30 | 26 | 4878 | 513 | 0 | 0 | 43.89 | 0 | 21.95 |
| ELFHash | 30 | 26 | 4878 | 513 | 0 | 0 | 43.89 | 0 | 21.95 |
其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句子哈希冲突个数。数据3为数据1的哈希值与1000003(大素数)求模后存储到线性表中冲突的个数。数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。
各种hash function的C 语言实现:
- 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);
- }
- https://www.byvoid.com/blog/string-hash-compare/
hash function比较的更多相关文章
- Hash function
Hash function From Wikipedia, the free encyclopedia A hash function that maps names to integers fr ...
- General Purpose Hash Function Algorithms
General Purpose Hash Function Algorithms post@: http://www.partow.net/programming/hashfunctions/inde ...
- Lintcode: Hash Function && Summary: Modular Multiplication, Addition, Power && Summary: 长整形long
In data structure Hash, hash function is used to convert a string(or any other type) into an integer ...
- STL标准库-一个万用的hash function
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 在前面我介绍过hash的使用,本次主要介绍一下Hash Function Hash Function即获得hash code的函 ...
- You shouldn't use *any* general-purpose hash function for user passwords, not BLAKE2, and not MD5, SHA-1, SHA-256, or SHA-3
hashlib - Secure hashes and message digests - Python 3.8.3 documentation https://docs.python.org/3.8 ...
- 常用加密算法学习总结之散列函数(hash function)
散列函数(Hash function)又称散列算法.哈希函数,散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来.该函数将数据打乱混合,重新创建一个叫做散列值(hash values ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- hash function 字符串哈希函数
#include <stdio.h> int hash(const char *str) { ; ;;i++) { if (str[i] == '\0') break; sum += (( ...
- STL hash function的模板特化
哈希函数的作用是将一个值映射为一个哈希值,从而根据这个哈希值,在哈希表中对数据进行定位. template <class _Val, class _Key, class _HashFcn, cl ...
随机推荐
- 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析(转)
. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenco ...
- 网页后缀html、htm、shtml、shtm有什么区别?
每一个网页或者说是web页都有其固定的后缀名,不同的后缀名对应着不同的文件格式和不同的规则.协议.用法,最常见的web页的后缀名是.html和.htm,但这只是web页最基本的两种文件格式,今天我们来 ...
- beep版千与千寻主题曲(转载自Ice_watermelon233)
#include <bits/stdc++.h> #include <windows.h> #define qdo 262 #define qre 294 #define qm ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--F-等式
链接:https://www.nowcoder.com/acm/contest/90/F 来源:牛客网 1.题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数.(x.y.n均 ...
- 范围for语句的整理
1.如何处理stirng中的每个字符?(来自C++Primer中文版5th中P83) 使用基于范围的for语句,比如下面的例子,输出每个字符 #include<iostream> #inc ...
- <逆向学习第二天>如何手动脱UPX、Aspack壳
UPS.AsPack压缩壳介绍: UPX .AsPack是一款先进的可执行程序文件压缩器.压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间.网络上传下载的时间和其它分布以及存储费用. ...
- 最大的最大公约数( 51nod-1179)
妈耶有日期显示啊,我还写什么... 给出N个正整数,找出N个数两两之间最大公约数的最大值. 例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5. ...
- oracle 12c rac vip和监听故障
环境:aix 7.1 ,oracle 12.1.0.2 rac -3节点. 硬件故障后,硬件工程师更换了内联网卡,不知为何资源VIP也有问题,只好先添加了VIP srvctl add vip -nod ...
- [原]解决phpstudy下的nginx无法运行的问题
一直在用phpstudy下的apache,今天忽然想切换到nginx,出现了一些错误,最终还是解决了. 之前是php 5.3 + apache 现在是php 5.3n + nginx 问题就出在这n上 ...
- html+php上传图片文件到服务器
html+php上传图片文件到服务器 一.html代码 <body> <form action="" method="post" enctyp ...