1.什么是哈希算法
哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。
计算方法:
用来产生一些数据片段(例如消息或会话项)的哈希值的算法。使用好的哈希算法,在输入数据中所做的更改就可以更改结果哈希值中的所有位;因此,哈希对于检测数据对象(例如消息)中的修改很有用。此外,好的哈希算法使得构造两个相互独立且具有相同哈希的输入不能通过计算方法实现。典型的哈希算法包括 MD2、MD4、MD5 和 SHA-1。哈希算法也称为“哈希函数”。
另请参阅: 基于哈希的消息验证模式 (HMAC), MD2, MD4, MD5,消息摘要, 安全哈希算法 (SHA-1)
MD5一种符合工业标准的单向 128 位哈希方案,由 RSA Data Security, Inc. 开发。 各种“点对点协议(PPP)”供应商都将它用于加密的身份验证。哈希方案是一种以结果唯一并且不能返回到其原始格式的方式来转换数据(如密码)的方法。质询握手身份验证协议(CHAP) 使用质询响应并在响应时使用单向 MD5哈希法。按照此方式,您无须通过网络发送密码就可以向服务器证明您知道密码。
质询握手身份验证协议(CHAP)“点对点协议(PPP)”连接的一种质询响应验证协议,在 RFC 1994 中有所描述。 该协议使用业界标准 MD5哈希算法来哈希质询串(由身份验证服务器所发布)和响应中的用户密码的组合。
点对点协议
用点对点链接来传送多协议数据报的行业标准协议套件。RFC 1661 中有关于 PPP 的文档。
另请参阅: 压缩控制协议 (CCP),远程访问,征求意见文档 (RFC),传输控制协议/Internet 协议 (TCP/IP),自主隧道。
2.哈希校验怎么用
哈希校验是一款小巧好用的哈希计算器,也是一款md5校验工具。支持文件拖放,速度很快,可以计算文件的 MD5、SHA1、CRC32 的值。
哈希校验在论坛上、软件发布时经常用,是为了保证文件的正确性,防止一些人盗用程序,加些木马或者篡改版权,设计的一套验证系统。每个文件都可以用Hash MD5验证程序算出一个固定的MD5码来。软件作者往往会事先计算出他的程序的MD5码并帖在网上。因此,在网上看到某个程序下载旁注明了 MD5 码时,可以把它记下来,下载了这个程序后用Hash验证程序计算你所下载的文件的MD5码,和你之前记下MD5码比较,就知道你下的是不是原版了,如果两者相同,那么你所下载的是原版。如果计算出来的和网上注明的不匹配,那么你下载的这个文件不完整,或是被别人动过手脚。
使用方法就是:打开哈希校验,把你下载的东西拖进Hash窗口,会自动得出你这个文件的MD5码,如果和你下载的里的那个 MD5码不同就说明被动过手脚,反之则说明是没问题的。
3.哈希索引和倒排查找怎么用简单
哈希(Hash)表 以上讲的查找方法基于比较的,查找效率依赖比较次数,其实理想的查找希望不经比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,这样查找k时,只要根据这个对应关系f找到给定值k的像f(k)。
这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也叫散列表)。
哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如何确定哈希函数和解决冲突是关键。
1.哈希函数的构造方法 直接定址法:H(k)=k 或H(k)=a*k+b(线形函数) 如:人口数字统计表 地址 1 2 3 。 100 年龄 1 2 3 。
100 人数 67 3533 244 。 4 数字分析法:取关键字的若干数位组成哈希地址 如:关键字如下:若哈希表长为100则可取中间两位10进制数作为哈希地址。
81346532 81372242 81387422 81301367 81322817 81338967 81354157 81368537 平方取中法:关键字平方后取中间几位数组成哈希地址 折叠法:将关键数字分割成位数相同的几部分(最后一部分的位数可以不同)然后取几部分的叠加和(舍去进位)作为哈希地址。 除留余数法:取关键字被某个不大于表长m的数p除后所得的余数为哈希地址。
H(k)=k mod p p<=m 随机数法:H(k)=rondom(k)。 2.处理冲突的方法 假设地址集为0..n-1,由关键字得到的哈希地址为j(0<=j<=n-1)的位置已存有记录,处理冲突就是为该关键字的记录找到另一个"空"的哈希地址。
在处理中可能得到一个地址序列Hi i=1,2,。k 0<=Hi<=n-1),即在处理冲突时若得到的另一个哈希地址H1仍发生冲突,再求下一地址H2,若仍冲突,再求H3。
怎样得到Hi呢? 开放定址法:Hi=(H(k)+di) mod m (H(k)为哈希函数;m为哈希表长;di为增量序列) 当di=1,2,3,。
m-1 时叫线性探测再散列。 当di=12,-12,22,-22,32,-32,。
,k2,-k2时叫二次探测再散列。 当di=random(m)时叫伪随机探测序列。
例:长度为11的哈希表关键字分别为17,60,29,哈希函数为H(k)=k mod 11,第四个记录的关键字为38,分别按上述方法添入哈希表的地址为8,4,3(随机数=9)。 再哈希法:Hi=RHi(key) i=1,2,。
,k,其中RHi均为不同的哈希函数。 链地址法:这种方法很象基数排序,相同的地址的关键字值均链入对应的链表中。
建立公益区法:另设一个溢出表,不管得到的哈希地址如何,一旦发生冲突,都填入溢出表。 3.哈希表的查找 例:如下一组关键字按哈希函数H(k)=k mod 13和线性探测处理冲突所得的哈希表a[0..15]: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 14 01 68 27 55 19 20 84 79 23 11 10 当给定值k=84,则首先和a[6]比在依次和a[7],a[8]比结果a[8]=84查找成功。
当给定值k=38,则首先和a[12]比,再和a[13]比,由于a[13]没有,查找不成功,表中不存在关键字等于38的记录。 5.5 查找第k小元素 查找第k小元素即在n个元素中(未排序)找到第k小的元素。
方法同快速排序,采用递归方式。 程序如下: program kspv; const n=7; type arr=array[1..n] of integer; var b:arr; i,k:integer; function p(s,t:integer):integer; var i,j,t1,x:integer; begin i:=s;j:=t;x:=b[i]; repeat while (b[j]>=x) and (j>i) do j:=j-1; if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end; while (b[i]<=x) and (i 暴雪公司有个经典的字符串的hash公式先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能工作,但。 也只能如此了。 最合适的算法自然是使用HashTable(哈希表),先介绍介绍其中的基本知识,所谓Hash,一般是一个整数,通过某种算法,可以把一个字符串"压缩" 成一个整数,这个数称为Hash,当然,无论如何,一个32位整数是无法对应回一个字符串的,但在程序中,两个字符串计算出的Hash值相等的可能非常小,下面看看在MPQ中的Hash算法 unsigned long HashString(char *lpszFileName, unsigned long dwHashType) { unsigned char *key = (unsigned char *)lpszFileName; unsigned long seed1 = 0x7FED7FED, 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; } Blizzard的这个算法是非常高效的,被称为"One-Way Hash",举个例子,字符串"unitneutralacritter.grp"通过这个算法得到的结果是0xA26067F3。 是不是把第一个算法改进一下,改成逐个比较字符串的Hash值就可以了呢,答案是,远远不够,要想得到最快的算法,就不能进行逐个的比较,通常是构造一个哈希表(Hash Table)来解决问题,哈希表是一个大数组,这个数组的容量根据程序的要求来定义,例如1024,每一个Hash值通过取模运算 (mod)对应到数组中的一个位置,这样,只要比较这个字符串的哈希值对应的位置又没有被占用,就可以得到最后的结果了,想想这是什么速度?是的,是最快的O(1),现在仔细看看这个算法吧 int GetHashTablePos(char *lpszString, SOMESTRUCTURE *lpTable, int nTableSize) { int nHash = HashString(lpszString), nHashPos = nHash % nTableSize; if (lpTable[nHashPos].bExists && !strcmp(lpTable[nHashPos].pString, lpszString)) return nHashPos; else return -1; //Error value } 看到此,我想大家都在想一个很严重的问题:"假如两个字符串在哈希表中对应的位置相同怎么办?",究竟一个数组容量是有限的,这种可能性很大。解决该问题的方法很多,我首先想到的就是用"链表",感谢大学里学的数据结构教会了这个百试百灵的法宝,我碰到的很多算法都可以转化成链表来解决,只要在哈希表的每个入口挂一个链表,保存所有对应的字符串就OK了。 事情到此似乎有了完美的结局,假如是把问题独自交给我解决,此时我可能就要开始定义数据结构然后写代码了。然而Blizzard的程序员使用的方法则是更精妙的方法。 基本原理就是:他们在哈希表中不是用一个哈希值而是用三个哈希值来校验字符串。 中国有句古话"再一再二不能再三再四",看来Blizzard也深得此话的精髓,假如说两个不同的字符串经过一个哈希算法得到的入口点一致有可能,但用三个不同的哈希算法算出的入口点都一致,那几乎可以肯定是不可能的事了,这个几率是1:,大概是10的 22.3次方分之一,对一个游戏程序来说足够安全了。 现在再回到数据结构上,Blizzard使用的哈希表没有使用链表,而采用"顺延"的方式来解决问题,看看这个算法: 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, nHashPos = nHashStart; while (lpTable[nHashPos].bExists) { if (lpTable[nHashPos].nHashA == nHashA && lpTable[nHashPos].nHashB == nHashB) return nHashPos; else nHashPos = (nHashPos 1) % nTableSize; if (nHashPos == nHashStart) break; } return -1; //Error value } 1. 计算出字符串的三个哈希值(一个用来确定位置,另外两个用来校验) 2. 察看哈希表中的这个位置 3. 哈希表中这个位置为空吗?假如为空,则肯定该字符串不存在,返回 4. 假如存在,则检查其他两个哈希值是否也匹配,假如匹配,则表示找到了该字符串,返回 5. 移到下一个位置,假如已经越界,则表示没有找到,返回 6. 看看是不是又回到了原来的位置,假如是,则返回没找到 7. 回到3 怎么样,很简单的算法吧,但确实是天才的idea, 其实最优秀的算法往往是简单有效的算法。 你问的应该是电驴里的文件hash 那是电驴特有的共享ID 只要那个不变,你改文件名什么的都可以一样在电驴上共享 eMule里什么是HASH? 很多御骡多年的老骡手可能和我一样给新手讲不清楚这个问题,在此我翻查了一些资料,并结合eMule的特性,给大家解释一下 首先我们经常挂在嘴上的就是Hash、UserHash、文件Hash等等这样的词汇 其实Hash翻译成中文是 哈希 在编程上又称作 哈希函数 那么这个函数在eMule 这个P2P软件中起到了什么作用呢? 这里我们需要了解一个概念MD(MD2、MD4、MD5) 我们都知道电影、音乐、软件等等都是以文件的形式储存在计算机器上的 但是我们有时候并没有必要看到文件的全部,或者是一部分才能了解这个文件 就好像看一本书一样,只要知道目录,就知道整本书大概的内容了 那么就由90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发 出一套Message-Digest Algorithm 单向HASH函数用于产生信息摘要。 当我们将一个文件放入eMule的共享文件里的时候 我们就开始了这样的算法步骤(大家都能体会到,硬盘狂转-提取文件信息的时候吧) 最终通过这一系列的算法我们得到了一个128个二进制位 ps: hash算法更多的是用来校验文件的完整性 当第一个人把自己的共享文件变成HASH值的时候,向服务器进行的提交 同时可能还有很多提交者,那么他们的HASH值就进入了服务器的一个动态列表里 列表中存放着的是拥有这些同样文件的用户的IP 、PORT等等地址信息 当另外的用户需要下载或者搜索时,服务器就把这个信息传递给需要的用户 那么这个用户就知道到底应该去哪里下载喽 当完成协议验证等等程序流程后,两个小骡骡就开始了点对点的传播。4.哈希函数怎么用pascal
5.hash文件是什么文件,怎么使用和打开