摘自论坛:http://bbs.csdn.net/topics/300172062,先保存下来

强烈的推荐你使用暴雪的mpq技术
我在个人机器上实现过4000万条字符串存储,碰撞很小
需要代码的话,请留下你的邮箱

这里留下我以前用过的一个小程序,稍做修给后应该可以满足你的要求:

#include <iostream>using namespace std;#define nTableSize  40000000#define nMaxStrLen  20unsigned long cryptTable[0x1000];typedef struct _MPQHASHTABLE{    char bExists;}MPQHASHTABLE;MPQHASHTABLE    HashTable[nTableSize];int                HashATable[nTableSize];int                HashBTable[nTableSize]; char            data[nTableSize][nMaxStrLen];class CHashForMpq{public:int insert_string(const char *string_in){const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;//定义哈希类型/*计算lpszString字符串经过解析后应该放入或者查询各表的数据*/unsigned int nHash = HashString(string_in, HASH_OFFSET);//生成要放入hash表中的数据unsigned int nHashA = HashString(string_in, HASH_A);//要放入hashA表中的数据unsigned int nHashB = HashString(string_in, HASH_B);//要放入hashB表中的数据unsigned int nHashStart = nHash % nTableSize;//计算起始查询位置unsigned int nHashPos = nHashStart;//初始化实际查询到的位置while (HashTable[nHashPos].bExists)//发生了碰撞
{ //校验碰撞原因if (HashATable[nHashPos]  == nHashA && HashBTable[nHashPos] == nHashB) break; //原始数据发生了重复,可能的情况:1.发生了错误,2.我们执行的是查询else nHashPos = (nHashPos + 1) % nTableSize;//说明数据没有重复,但原来的位置上有数据,也就是发生了碰撞的情况,所以将实际位置偏移if (nHashPos == nHashStart) {cout<<"表已满,无法插入数据"<<endl;return 0; }}/*插入的情况*/if (!HashTable[nHashPos].bExists && (strlen(string_in) < nMaxStrLen)){   HashATable[nHashPos] = nHashA;HashBTable[nHashPos] = nHashB;strcpy(data[nHashPos], string_in);HashTable[nHashPos].bExists = 1;cout<<"字符串"<<string_in<<"插入成功,位于"<<nHashPos<<endl;}else{if(HashTable[nHashPos].bExists)cout<<"字符串"<<string_in<<"已存在于表中,无法插入"<<endl;elsecout<<"字符串"<<string_in<<"长度超标,无法插入"<<endl;}return nHashPos;}int search_string(const char *string_in){const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;//定义哈希类型/*计算lpszString字符串经过解析后应该放入或者查询各表的数据*/unsigned int nHash = HashString(string_in, HASH_OFFSET);//生成要放入hash表中的数据unsigned int nHashA = HashString(string_in, HASH_A);//要放入hashA表中的数据unsigned int nHashB = HashString(string_in, HASH_B);//要放入hashB表中的数据unsigned int nHashStart = nHash % nTableSize;//计算起始查询位置unsigned int nHashPos = nHashStart;//初始化实际查询到的位置while (HashTable[nHashPos].bExists)//发生了碰撞
{ //校验碰撞原因if (HashATable[nHashPos]  == nHashA && HashBTable[nHashPos] == nHashB) break; //原始数据发生了重复,可能的情况:1.发生了错误,2.我们执行的是查询else nHashPos = (nHashPos + 1) % nTableSize;//说明数据没有重复,但原来的位置上有数据,也就是发生了碰撞的情况,所以将实际位置偏移if (nHashPos == nHashStart) cout<<"字符串"<<string_in<<"不在表中"<<endl;return 0; }if(strlen(data[nHashPos])){cout<<"字符串"<<string_in<<"在表中"<<nHashPos<<endl;return nHashPos;}elsecout<<"字符串"<<string_in<<"不在表中"<<endl;}/*生成密码表*/
void prepareCryptTable(){ unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;for( index1 = 0; index1 < 0x100; index1++ ){ for( index2 = index1, i = 0; i < 5; i++, index2 += 0x100 ){ unsigned long temp1, temp2;seed = (seed * 125 + 3) % 0x2AAAAB;temp1 = (seed & 0xFFFF) << 0x10;seed = (seed * 125 + 3) % 0x2AAAAB;temp2 = (seed & 0xFFFF);cryptTable[index2] = ( temp1 | temp2 ); } } }private:/*按照dwHashType定义的类型取得字符串lpszFileName的各项hash值*/
unsigned long HashString(const char *lpszFileName, unsigned long dwHashType ){ unsigned char *key  = (unsigned char *)lpszFileName;unsigned long seed1 = 0x7FED7FED;unsigned long seed2 = 0xEEEEEEEE;int ch;while( *key != 0 ){ ch = *key++;seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3; }return seed1; }};void main(){CHashForMpq cHashForMpq;cHashForMpq.prepareCryptTable();cHashForMpq.insert_string("abcdefghijklmnopqrstuvwxyz");cHashForMpq.insert_string("abcd");cHashForMpq.insert_string("ab");cHashForMpq.insert_string("ab");cHashForMpq.search_string("abcd");cHashForMpq.search_string("efd");getchar();} 

哈希算法--暴雪的mpq技术相关推荐

  1. 哈希算法原理与应用:确保数据完整性和安全性的关键技术

    哈希算法是一种将任意长度的消息映射为固定长度摘要或哈希值的算法.哈希算法主要被用于验证数据的完整性和安全性.哈希算法的应用广泛,例如在密码学中用于验证数据完整性和数字签名,也用于检索数据和进行散列分布 ...

  2. 密码技术--国密SM3哈希算法及Go语言应用

    SM3杂凑算法 sm3是我国国产的哈希算法,是一种密码散列函数标准,有国家密码管理局与2010年12月17日发布,该算法主要用于数字签名及验证,消息认证码生成及验证,随机数生成等,算法公开,其效率与s ...

  3. MPQ技术内幕(转载)

    开始尝试翻译一些英文文章,最近正好对mpq产生兴趣,看到一片文章叫做 inside MPQ,于是翻译一下,就当锻炼自己吧.这篇文章非常的不厚道,在关键地方戛然而止,而且没有更新的迹象.让人郁闷无比.但 ...

  4. 感知哈希算法——找出相似的图片

    参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格 ...

  5. 五分钟带你了解哈希算法

    导读: 当新人在学区块链技术的时候,都会听到哈希和哈希算法,这似乎是无处不在的安全性保证.例如比特币或者以太坊这种运行去中心化网络和共识的机器,都会有上万个节点通过P2P连接,并且需要"无需 ...

  6. 区块链课程笔记-第一课哈希算法在加密中的应用

    哈希密码,哈希碰撞的含义,即我们有一个值x经过哈希变换得到y. 输出y是有限的,2的256次幂,但是输入x是无限的.输入值的一点点变动,输出的值都会变动.但是如果输入不同的值,而得到了相同的值,那么就 ...

  7. 【转】感知哈希算法——找出相似的图片

    Google 图片搜索功能 在谷歌图片搜索中, 用户可以上传一张图片, 谷歌显示因特网中与此图片相同或者相似的图片. 比如我上传一张照片试试效果: 原理讲解 参考Neal Krawetz博士的这篇文章 ...

  8. java 取绝对值_Java实现一致性哈希算法,并搭建环境测试其负载均衡特性

    实现负载均衡是后端领域一个重要的话题,一致性哈希算法是实现服务器负载均衡的方法之一,你很可能已在一些远程服务框架中使用过它.下面我们尝试一下自己实现一致性哈希算法. 一. 简述一致性哈希算法 这里不详 ...

  9. 一致性哈希算法的基本原理

    题目: 工程师使用服务器集群来设计和实现数据缓存,以下是常见的策略 1.无论是添加.查询还是删除数据,都先将数据的id通过哈希函数转化为一个哈希值,标记为key 2.如果目前机器有N台,则计算key% ...

最新文章

  1. Error 0162 - Setup data integrity check failure after updating BIOS via Thinkvantage
  2. fragment生命周期
  3. 如何找到foreach索引
  4. 网站优化常见的五个易错点!
  5. Linux中log的目录,/var/log目录中Linux日志文件的功能详解
  6. VTK:可视化之ProteinRibbons
  7. 【clickhouse】clickhouse 副本与分片 副本详解
  8. oracle 12c transaction guard,oracle 12c的Data guard中废弃
  9. 云时代,运维要么自己写代码,要么开发替你写了
  10. uml的图与代码的转换——类图
  11. mysql 5.6 二进制安装包_centos6上mysql5.6二进制包安装
  12. 苹果电脑屏幕刷新率如何调整
  13. 云ecs服务器自动重启,云服务器需要定时重启吗?服务器进行重启的原因是什么?...
  14. 记录一下最近安装的Tongweb
  15. rootkit模拟木马病毒
  16. python金融分析小知识(25)——如何计算股票每日的收益率并进一步计算净值
  17. ubuntu14.04 clementine音乐播放器无法播放ape格式解决方法
  18. 2021 ICCV TIMI-Net 抠图网络论文笔记
  19. 神经网络量化--per-channel量化
  20. Ubuntu 16.04 VCS+Verdi安装总结

热门文章

  1. 华为android10系统版本自动更新,华为P30系列系统重大升级!安卓10来了
  2. 易车上汽车报价准不准
  3. 免费外链图片网站收集
  4. marquee图片无缝拼接滚动
  5. 常用软件------系统必备软件
  6. 快讯| RStudio Connect 发布
  7. Linux进程间通信第四讲 标准IPC之信号量集
  8. 随笔:使用Windows搭建AAA认证服务器
  9. 使用C++实现谷歌身份验证器(Google Authenticator)
  10. 蘑菇街财报:曾经电商第四极的直播末路