用特定的转化规则,将字符串转成进制数用一定规则存放。
实现哈希查找

#include <stdio.h>
#include <ctype.h>     //多谢citylove指正。typedef struct
{int nHashA;
int nHashB;
int bExists ;//是否冲突
}MPQHASHTABLE;
int nTableSize=40000000;
//crytTable[]里面保存的是HashString函数里面将会用到的一些数据,在prepareCryptTable
//函数里面初始化
unsigned long cryptTable[0x500];//以下的函数生成一个长度为0x500(合10进制数:1280)的cryptTable[0x500]
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 );}}
}//以下函数计算lpszFileName 字符串的hash值,其中dwHashType 为hash的类型,
//在下面GetHashTablePos函数里面调用本函数,其可以取的值为0、1、2;该函数
//返回lpszFileName 字符串的hash值;
unsigned long HashString( 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 = toupper(*key++);seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;}return seed1;
}void initHashTable(MPQHASHTABLE *lpTable,int size)
{int i;lpTable=(MPQHASHTABLE *)malloc(sizeof(MPQHASHTABLE)*size);for( i=0;i<size;i++){lpTable->bExists=0;//不冲突lpTable->nHashA=0;lpTable->nHashB=0;}
}
void insertHashTable(MPQHASHTABLE *lpTable,char * lpszString)
{const int  HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;int  nHash = HashString(lpszString, HASH_OFFSET);int  nHashA = HashString(lpszString, HASH_A);int  nHashB = HashString(lpszString, HASH_B);int  nHashStart = nHash % nTableSize;int  nHashPos = nHashStart;while ( lpTable[nHashPos].bExists!=1 ){/* 如果仅仅是判断在该表中时候存在这个字符串,就比较这两个hash值就可以了,不用对结构体中的字符串进行比较。这样会加快运行的速度?减少hash表占用的空间?这种
方法一般应用在什么场合?*/nHashPos = (nHashPos + 1) % nTableSize;}lpTable[nHashPos].nHashA =nHashA;lpTable[nHashPos].nHashB = nHashB ;}
int GetHashTablePos( char *lpszString, MPQHASHTABLE *lpTable, int nTableSize )
{const int  HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;int  nHash = HashString(lpszString, HASH_OFFSET);int  nHashA = HashString(lpszString, HASH_A);int  nHashB = HashString(lpszString, HASH_B);int  nHashStart = nHash % nTableSize;int  nHashPos = nHashStart;while ( lpTable[nHashPos].bExists ){/* 如果仅仅是判断在该表中时候存在这个字符串,就比较这两个hash值就可以了,不用对结构体中的字符串进行比较。这样会加快运行的速度?减少hash表占用的空间?这种
方法一般应用在什么场合?*/if (lpTable[nHashPos].nHashA == nHashA&&  lpTable[nHashPos].nHashB == nHashB ){return nHashPos;}else{nHashPos = (nHashPos + 1) % nTableSize;}if (nHashPos == nHashStart) break;}return -1;
}
int main()
{//char *A={"jttqzh","kwztsgxx","ilovestudy"};MPQHASHTABLE *l;initHashTable(l,nTableSize);insertHashTable(l,"niceday");insertHashTable(l,"studyday");insertHashTable(l,"library");printf("%d\nf",GetHashTablePos("niceday",l,nTableSize));
}

mpq算法实现哈希查找相关推荐

  1. 查找算法系列之复杂算法:哈希查找

    查找算法系列之复杂算法:哈希查找 眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/det ...

  2. Hash函数与算法、哈希查找、哈希冲突解决方法总结

    Hash哈希知识点导航 1.基本概念 2. 哈希函数   2.1 直接寻址法   2.2 数字分析法   2.3 平方取中法   2.4 折叠法   2.5 随机数法   2.6 除留余数法 3. 哈 ...

  3. 经典算法学习——哈希查找

    哈希查找也称为散列查找.所谓的哈希其实就是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的映射f ...

  4. 【查找算法】哈希查找法

    本篇文章将介绍一种新的查找算法--哈希查找. 文章目录 何为哈希查找? 散列表 冲突 构造散列函数 直接定址法 除留余数法 解决冲突的方式 开放地址法 链地址法 查找效率分析 何为哈希查找? 先看定义 ...

  5. JAVA算法:哈希查找

    哈希查找(Hash Search) 概念: 哈希法:又称散列法.杂凑法或关键字地址计算法等,相应的表称为哈希表. 哈希表的装填因子α: α = 哈希表中元素个数 / 哈希表的长度 α可描述哈希表的装满 ...

  6. ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法

    哈希表概念 哈希表(散列表),是基于关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数(哈希函数 ...

  7. lfu算法实现c语言_哈希查找算法(C语言实现)

    上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作.在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该 ...

  8. 【数据结构----笔记2】查找算法之【哈希查找或散列查找】

    /*__________________________________________________________________________________________________ ...

  9. 数据结构和算法系列13 五大查找之哈希查找

    原文地址 http://www.cnblogs.com/mcgrady/p/3294871.html 数据结构和算法系列13 五大查找之哈希查找 这一篇要总结的是五天查找的最后一篇,哈希查找,也称为散 ...

  10. c语言求不成功查找长度的代码_哈希查找算法(C语言实现)

    上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作.在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该 ...

最新文章

  1. logcat错误日志
  2. python医疗系统代码_吴裕雄 人工智能 java、javascript、HTML5、python、oracle ——智能医疗系统WEB端复诊代码简洁版实现...
  3. [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
  4. immutable.js笔记
  5. mysql中in的使用
  6. 【毕设】ASP.net校友录毕业设计(源代码+论文+开题报告+答辩PPT)
  7. 矩阵乘法c语言蓝桥杯,[蓝桥杯][基础练习VIP]矩阵乘法 (C语言代码)
  8. 设计模式之GOF23享元模式
  9. 语言判断一个整数是奇数还是偶数_一个变量“存储”任意多的数 从“康托配对函数”聊开去...
  10. STL学习笔记1--vector
  11. l301更换废墨垫图解_30换30?
  12. 98.android 全国城市区号,座机号区号匹配对应城市
  13. Python 救救我!如何连接串口实现一个报警灯报警器
  14. 中继器是什么计算机网络,中继器是什么
  15. 【信息系统项目管理师】第十七章 项目管理高级知识
  16. Python吴恩达深度学习作业15 -- YOLO原理及应用(自动驾驶——汽车检测)
  17. HR面/综合面系列:职业相关
  18. SoFiA2用户手册自翻译
  19. 【GIT】git cz配置使用方法
  20. 查看显卡单精度 linux,部分显卡及CPU单、双精度算力实则(3月9日更新数据)

热门文章

  1. cad刷新快捷键_100个快捷键50个CAD技巧,助你玩转CAD
  2. Python实现pdf转word
  3. Louvain社区划分算法及Java语言实现
  4. Gephi下载百度云加速,舒服了
  5. 教育大数据采集机制与关键技术研究
  6. object c中的多态
  7. sql-server 不允许保存更改,解决办法
  8. 用VBA自动整理系统导出的订单
  9. 电脑主机前面的耳机插孔没声音怎么办
  10. iText 7 基础