1 Locality Sensitive Hash Functions

1 Locality Sensitive Hash Functions
1 Locality Sensitive Hash Functions

CS493:Algorithms for Massive Data Sets Estimating Similarity 04/04/2002Scribe:Ding Liu 1Locality Sensitive Hash Functions

In this lecture we will be talking about algorithms for estimating similarity.Fix a collection C of objects.We de?ne a similarity function sim(x,y)that maps pairs of objects x,y∈C to a number in[0,1].sim(x,y)measures the similarity between x and y.sim(x,y)=1 means that x and y are identical;sim(x,y)=0means that x and y are very di?erent.For example when C is a set of unit vectors in R d,we can de?ne sim( u, v)to be1?θ( u, v)/πwhereθ( u, v)is the angle between u and v.

Given C and sim(x,y),a locality sensitive hash function family F operates on C,such that for any x,y∈C,

Prob h∈F[h(x)=h(y)]=sim(x,y)

Below are two examples of locality sensitive hash function family.

?C is a collection of sets.For two sets A,B∈C,sim(A,B)=|A∩B|/|A∪B|.Broder et al.[1]introduced the notion of min-wise independent permutations,which can be used to construct locality sensitive hash functions for this similarity measure,known as the Jaccard coe?cient.

?C is a collection of unit vectors.For two vectors u, v,sim( u, v)=1?θ( u, v)/πwhere θ( u, v)is the angle between u and v.A locality sensitive hash function family is de?ned as follows.Let S d?1?R d denote the unit(d?1)-sphere{ v∈R d: v =1}.Let r be a vector drawn uniformly at random from S d?1.Corresponding to this r we have

a hash function h r such that h r( u)=1if r· u≥0,and h r( u)=0if r· u<0.The

following fact was used by Goemans and Williamson[3]as a rounding step in their approximation algorithm for MAX-CUT:

Prob[h r( u)=h r( v)]=1?θ( u, v)/π

The second example above also provides a way of constructing locality sensitive hash functions for sets,but for some similarity measure di?erent from the?rst example above. Given a set A whose elements are drawn from a base set U.We can represent A by a vector v A∈{0,1}|U|as follows:if the i-th element of U belongs to A then the i-th bit of v A is1, otherwise it is0.For this set of vectors,we apply the hashing scheme of the second example above.Thus we obtain a hashing scheme for a collection of sets such that:

Prob[h(A)=h(B)]=1?δ/π

where

cosδ= v A· v B

2Existence of Locality Sensitive Hash Functions

The material of this section is from[2].The?rst result is a necessary condition for the existence of locality sensitive hash function families for a given similarity measure.

Theorem2.1If similarity function sim(x,y)admits a locality sensitive hash function fam-ily,then the distance function1?sim(x,y)satis?es the triangle inequality.

Proof.Suppose there exists a locality sensitive hash function family F such that

sim(x,y)=Prob h∈F[h(x)=h(y)]

Then

1?sim(x,y)=Prob h∈F[h(x)=h(y)]

Let?h(x,y)be the indicator variable for the event h(x)=h(y).That is,?h(x,y)=1 if h(x)=h(y),and?h(x,y)=0otherwise.We claim that?h(x,y)satis?es the triangle inequality:

?h(x,y)+?h(y,z)≥?h(x,z)(1) The reason is that the only possible way to violate inequality1is to let?h(x,y)=?h(y,z)= 0and?h(x,z)=1.But in this case h(x)=h(y)=h(z),contradicting with?h(x,z)=1. Take the expectation of inequality1over h∈F,we get

E h∈F[?h(x,y)]+E h∈F[?h(y,z)]≥E h∈F[?h(x,z)](2)

To conclude the proof we observe that for any x,y

E h∈F[?h(x,y)]=1?sim(x,y)

1

min(|A|,|B|)

Consider the sets A={a},B={b},C={a,b}.For the Dice’s coe?cient,

sim Dice(A,C)=2

3

,sim Dice(A,B)=0

(1?sim Dice(A,C))+(1?sim Dice(C,B))<(1?sim Dice(A,B))

Similarly for the Overlap coe?cient:

sim Ovl(A,C)=1,sim Ovl(C,B)=1,sim Ovl(A,B)=0

(1?sim Ovl(A,C))+(1?sim Ovl(C,B))<(1?sim Ovl(A,B)) Sometimes it is desirable to have a hash function family that maps objects to0or1.The following theorem says that we can always obtain such a binary hash function family,with some modi?cation on the similarity measure.

Theorem2.2Given a locality sensitive hash function family F for sim(x,y),we can obtain another locality sensitive hash function family F that maps objects to{0,1}and corresponds to the similarity function(1+sim(x,y))/2.

Proof.Suppose we have a hash function family F such that

sim(x,y)=Prob h∈F[h(x)=h(y)]

Let B be a pairwise independent family of hash functions that operate on the domain of the functions in F and map elements in the domain to{0,1}.In other words for u,v in that domain,Prob b∈B[b(u)=b(v)]=1/2if u=v,and Prob b∈B[b(u)=b(v)]=1if u=v.We then consider the hash function family obtained by composing a hash function from F with one from B.We denote it by F and show that it satis?es the requirements of this theorem.

Given two objects x,y.Fix h∈F and b∈B.With probability sim(x,y),h(x)=h(y) and hence b(h(x))=b(h(y)).With probability1?sim(x,y),h(x)=h(y)and in this case, Prob b∈B[b(h(x))=b(h(y))]=1/2.Thus,

Prob h∈F,b∈B[b(h(x))=b(h(y))]=sim(x,y)+(1?sim(x,y))/2

=(1+sim(x,y))/2

Theorem2.4For any similarity function sim(x,y)that admits a locality sensitive hash function family,the distance function1?sim(x,y)is isometrically embeddable in the d-dimensional Hamming cube for some integer d.

Proof.We?rst apply Theorem2.2to construct a binary locality sensitive hash function family F for the similarity function(1+sim(x,y))/2.We arbitrarily order the hash functions of F and call them h1,...,h d(so d=|F|).Given a object x,we map it to a binary vector f(x)=(h1(x),...,h d(x)).Note that function f is an embedding of objects into the Hamming cube.We only need to show that it is an isometric embedding of the distance function1?sim(x,y).

Take any two objects x,y.f(x)=(h1(x),...,h d(x))and f(y)=(h1(y),...,h d(y)). Recall that F has the following property(Theorem2.2):

1+sim(x,y)

Prob h∈F[h(x)=h(y)]=1?

We comment that Theorem2.4has a weak converse,that is,any isometric embedding of the distance function1?sim(x,y)in the Hamming cube yields a locality sensitive hash function family corresponding to the similarity measure(α+sim(x,y))/(α+1)for someα. Note that(α+sim(x,y))/(α+1)is in the range[α/(α+1),1].

3Estimating Similarity of Vectors

We consider the following problem:given a set V of n vectors in R d and a query vector q, decide if there exists a vector v∈V such that sim( v, q)≥αwhereαis a constant(say0.9). In other words,the algorithm answers“yes”if such a vector exists and reports it,and“no”otherwise.If we look at the probability of answering“yes”as a function of max v∈V sim( v, q), then it is a threshold function as shown on the left part of Figure1.In the following we show that by using locality sensitive hash functions we can approximate this threshold function. In fact we are presenting a randomized algorithm that solves this problem with constant probability.

Recall that in Section1we give a locality sensitive hash function family H for a collection of vectors in R d.We take k functions h1,...,h k from H uniformly at random,for some integer k.For a vector v we concatenate the k bits obtained by applying these k functions to v.We use g1∈H k to de?ne this mapping,that is,g1( v)=(h1( v),...,h k( v))∈{0,1}k.We apply g1to each v∈V and call the resulting n vectors a group.

0.90.911

Prob

Figure 1:Threshold function and its approximation.

For some integer l ,we form l groups independently.They are de?ned by l functions g 1,...,g l .During preprocessing we store v with each g j ( v ),for 1≤j ≤l .

To answer a query q ,we compute g 1( q ),...,g l ( q ).For each g j ( q )we identify those v such that g j ( v )=g j ( q ).Then for each v identi?ed we test if sim ( v , q )≥α.If this is the case then we answer “yes”and report v .Otherwise we answer “no”after testing all the identi?ed vectors.

Let v 0be the vector of V that maximizes sim v ∈V (

v , q ),and let p 0=sim ( v 0, q ).It is easy to see that the above algorithm is correct when v 0is one of those vectors identi?ed.What is the probability for this to happen?We ?rst look at g 1and its k functions h 1,...,h k .For each h i ,Prob[h i ( v 0)=h i ( q )]=p 0.So Prob[g 1( v 0)=g 1( q )]=p k 0.If g 1( v

0)=g 1( q )then we say that v 0and q agree on group g 1.So the probability that v 0and q do not agree on all

l groups is (1?p k 0)l .Our algorithm is correct when v

0and q agree on at least one group,which happens with probability 1?(1?p k 0)l .If we plot this probability as a function of p 0

(with ?xed k and l ),we get something similar to the right part of Figure 1.

If we modify the above algorithm such that we test vectors that agree with the query

on at least two groups,then the probability function becomes 1?(1?p k 0)l ?lp k 0(1?p k 0)

l ?1.This function looks similar to 1?(1?p k 0)l ,but “sharper”than the latter.That is,this new

function moves from its low function value range (close to 0)to its high function value range (close to 1)more quickly than the previous one.

4Approximate Nearest Neighbor Searching

In this section we consider the approximate nearest neighbor searching problem.The problem is as follows.Given a collection C of n objects from a base set U .Given a distance function D (x,y )that operates on any two objects x,y ∈U .We want to preprocess C such that given any on-line query q ∈U ,we can quickly ?nd an (1+ )-approximate nearest neighbor of q in C .We call p ?an (1+ )-approximate nearest neighbor of q if for any p ∈C ,D (p ?,q )≤

(1+ )D(p,q).This is a general form of the problem.For example,we can let U be R d,C be a set of n points,and D(x,y)be the Euclidean distance between points x and y.

The approximate nearest neighbor searching problem(and its variants)has a considerable amount of literature.Here we list a couple of recent papers:Kleinberg[5],Indyk and Motwani[4],Kushilevitz,Ostrovsky,and Rabani[6].

The approximate nearest neighbor searching problem considered in this Lecture(and the next)is in the Hamming space.That is,U is H d,each point is a0-1vector in dimension d, and D(x,y)is H(x,y)(the Hamming distance).We de?ne the similarity between x and y as:sim(x,y)=1?H(x,y)/d.We also observe that locality sensitive hash function families exist for this similarity measure.For example the following d functions h1,...,h d constitute such a family:h i maps x∈{0,1}d into its i-th bit.

We will be using the algorithm of Section3.There we developped techniques for esti-mating similarity between vectors,but it is easy to see that the same strategy applies to other similarity measures as well.As a warm-up,we observe that by calling the algorithm of Section3log d times we can get a2-approximate nearest neighbor(with certain proba-bility).In fact,it su?ces to ask the following sequence of questions:is there a point whose Hamming distance from the query is at most1?at most2?at most4?and so on···In general the i-th question is:is there a point whose distance from the query is at most2i.To answer this question we setα(the similarity threshold)to1?2i/d.The correctness of this 2-approximate nearest neighbor algorithm is obvious.

To solve the(1+ )-approximate nearest neighbor problem we solve the following(r1,r2)-neighbor problem?rst,with r1

?Determine whether there exists a point p whose distance from the query is at most r1.

If yes,then return a point p whose distance from the query is at most r2.

?Determine whether all points are at distance more than r2from the query.

We show how to solve this(r1,r2)-neighbor problem(with constant probability)in sublin-ear time.In the next lecture we will use it to solve the(1+ )-approximate nearest neighbor problem.

We use terminology from Section3.For k and l speci?ed later,we form l groups with each group de?ned by k locality sensitive hash functions.As what we did in Section3,we compute g1(q),...,g l(q)and test those p such that p agrees with q in at least one group.In order to obtain sublinear running time(we will see this later)we interrupt the search after ?nding2l points,including duplicates.Let p1,...,p t(t≤2l)be the points we encountered. For each p j if it is within distance r2from q then we answer“yes”and return p j;we answer “no”if all the points are at distance more than r2from q.It is easy to see that the algorithm is correct if the following two properties hold with constant probability:

1.If there exists p such that D(p,q)≤r1then g j(p)=g j(q)for some j=1,...,l.

2.The total number of p such that D(p,q)≥r2and yet g j(p)=g j(q)for some j=1,...,l

is less than2l.

In the next lecture we will show that by picking appropriate values for k and l we can: (1)make the desired probability lower bounded by a constant;(2)use this algorithm as a sub-routine in approximate nearest neighbor searching to achieve sublinear query time. References

[1]Broder,A.Z.,Charikar,M.,Frieze,A.,Mitzenmacher,M.Min-wise independent permu-

tations,Proc.ACM STOC(1998),pp.327–336.

[2]Charikar,M.Similarity estimation techniques from rounding algorithms,Proc.ACM

STOC(2002),To appear.

[3]Goemans,M.X.,Williamson,D.P.Improved approximation algorithms for maximum cut

and satis?ability problems using semide?nite programming,J.ACM42(1995),1115–1145.

[4]Indyk,P.,Motwani,R.Approximate nearest neighbors:Towards removing the curse of

dimensionality,Proc.ACM STOC(1998),604–613.

[5]Kleinberg,J.M.Two algorithms for nearest-neighbor search in high dimensions,Proc.

ACM STOC(1997),599–608.

[6]Kushilevitz,E.,Ostrovsky,R.,Rabani,Y.E?cient search for approximate nearest neigh-

bor in high dimensional spaces,SIAM https://www.360docs.net/doc/984978326.html,PUT.30(2000),457–474.

哈希算法散列

计算机算法领域 基本知识 Hash,一般翻译做“散列”,也有直接音译为”哈希“的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系 基本概念 * 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。 * 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 常用的构造散列函数的方法 散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位ǐ 1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a?key + b,其中a和b为常数(这种散列函数叫做自身函数) 2. 数字分析法 3. 平方取中法 4. 折叠法 5. 随机数法 6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。 处理冲突的方法 1. 开放寻址法;Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法: 1. di=1,2,3,…, m-1,称线性探测再散列; 2. di=1^2, (-1)^2, 2^2,(-2)^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列;

数据结构实验 散列表实验报告

课程实验报告 课程名称:数据结构 实验项目名称:散列表 专业班级: 姓名:XXX 学号: 完成时间:2015 年06 月13 日

背景 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。在理想情况下,查找、插入、删除操作的时间均为O(1),是一种高效的动态集合结构。 例1:计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键值为任意字符串,与语言中的标识符对应。该符号表常采用散列表。 例2:为了节约空间,常常需要把文本文件采用压缩编码方式存储。LZW是对文本文件进行压缩和解压缩的方法之一,该方法采用了散列。 问题描述 我们希望在浩瀚的图书中,去发现一本书是否存在。我们不知道书的编号,只知道它的书名。(其实这已经不错了...)。通过书名,来查询它是否存在。 为了简化问题,我们假设每本书的书名都是一组小写字母组成,长度不超过100字符。 基本要求 (1)根据输入建立图书名称表,采用散列表实现该表,散列函数选用BKDE 字符串哈希。 (2)数据的输入输出格式: 输入分为两部分 第一部分,第一行是行数n,n <= 5000。余下n行,每行一个字符串。表示已存 在的图书记录。 第二部分,第一行是行数m,m <= 1000。余下m行,每行一个字符串。表示要查 询的图书记录。 输出: 输出为m行,如果被查的记录存在,则输出"YES",如果不存在则输出"NO"。 测试数据 输入: 4 a ans and hellocpp

一致性哈希算法应用及优化(最简洁明了的教程)

一致性哈希算法的应用及其优化 一.简单哈希算法 哈希(Hash)就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,使得散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。哈希算法是一种消息摘要算法,虽然哈希算法不是一种加密算法,但由于其单向运算,具有一定的不可逆性使其成为加密算法中的一个重要构成部分。 二.分布式缓存问题 哈希算法除了在数据加密中的运用外,也可以用在常见的数据分布式技术中。哈希计算是通过求模运算来计算哈希值的,然后根据哈希值将数据映射到存储空间中。设有由N 个存储节点组成的存储空间,采用简单哈希计算将一个数据对象object 映射到存储空间上的公式为:Hash(object)% N。 现在假设有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式已经不能满足用户的访问,于是想引入Memcached作为缓存机制。现在一共有三台机器可以作为Memcached服务器,如下图1所示。

图1.三台memcached服务器 可以用简单哈希计算:h = Hash(key) % 3 ,其中Hash是一个从字符串到正整数的哈希映射函数,这样能够保证对相同key的访问会被发送到相同的服务器。现在如果我们将Memcached Server分别编号为0、1、2,那么就可以根据上式和key计算出服务器编号h,然后去访问。 但是,由于这样做只是采用了简单的求模运算,使得简单哈希计算存在很多不足: 1)增删节点时,更新效率低。当系统中存储节点数量发生增加或减少时,映射公式将发生变化为Hash(object)%(N±1),这将使得所有object 的映射位置发生变化,整个系统数据对象的映射位置都需要重新进行计算,系统无法对外界访问进行正常响应,将导致系统处于崩溃状态。 2)平衡性差,未考虑节点性能差异。由于硬件性能的提升,新添加的节点具有更好的承载能力,如何对算法进行改进,使节点性能可以得到较好利用,也是亟待解决的一个问题。 3)单调性不足。衡量数据分布技术的一项重要指标是单调性,单调性是指如果已经有一些内容通过哈希计算分派到了相应的缓冲中,当又有新的缓冲加入到系统中时,哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。 由上述分析可知,简单地采用模运算来计算object 的Hash值的算法显得过于简单,存在节点冲突,且难以满足单调性要求。

哈希表实验报告完整版

实验报告 姓名:学号: 1.实验题目 针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。 基本要求:假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 2.需求分析 本演示程序用VC编写,完成哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。 输出形式:地址,关键字,收索长度,H(key),拼音 3.概要设计 typedef struct NAME typedef struct hterm void InitNameList() void CreateHashList() void FindList() void Display() int main() 4.详细设计 #include #include #include

#define HASH_LEN 50 #define M 47 #define NAME_NO 8 typedef struct NAME { char *py; //名字的拼音 int k; //拼音所对应的整数}NAME; NAME NameList[HASH_LEN]; typedef struct hterm //哈希表{ char *py; //名字的拼音 int k; //拼音所对应的整数int si; //查找长度 }HASH; HASH HashList[HASH_LEN]; void InitNameList() { NameList[0].py="houxinming"; NameList[1].py="abc"; NameList[2].py="defdgf"; NameList[3].py="zhangrji"; NameList[4].py="jiaxin"; NameList[5].py="xiaokai"; NameList[6].py="liupeng"; NameList[7].py="shenyonghai";

单向散列函数算法Hash算法

单向散列函数算法(Hash算法): 一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数(过程不可逆),常见的单向散列算法有MD5,SHA.RIPE-MD,HAVAL,N-Hash 由于Hash函数的为不可逆算法,所以软件智能使用Hash函数作为一个加密的中间步骤 MD5算法: 即为消息摘要算法(Message Digest Algorithm),对输入的任意长度的消息进行预算,产生一个128位的消息摘要 简易过程: 1、数据填充..即填出消息使得其长度与448(mod 512)同余,也就是说长度比512要小64位(为什么数据长度本身已经满足却仍然需要填充?直接填充一个整数倍) 填充方法是附一个1在后面,然后用0来填充.. 2、添加长度..在上述结果之后附加64位的消息长度,使得最终消息的长度正好是512的倍数.. 3、初始化变量..用到4个变量来计算消息长度(即4轮运算),设4个变量分别为A,B,C,D(全部为32位寄存器)A=1234567H,B=89abcdefH,C=fedcba98H,D=7654321H 4、数据处理..首先进行分组,以512位为一个单位,以单位来处理消息.. 首先定义4个辅助函数,以3个32为双字作为输入,输出一个32为双字 F(X,Y,Z)=(X&Y)|((~X)&Z) G(X,Y,Z)=(X&Z)|(Y&(~Z)) H(X,Y,Z)=X^Y^Z I(X,Y,Z)=Y^(X|(~Z)) 其中,^是异或操作 这4轮变换是对进入主循环的512为消息分组的16个32位字分别进行如下操作: (重点)将A,B,C,D的副本a,b,c,d中的3个经F,G,H,I运算后的结果与第四个相加,再加上32位字和一个32位字的加法常数(所用的加法常数由这样一张表T[i]定义,期中i为1至64之中的值,T[i]等于4294967296乘以abs(sin(i))所得结果的整数部分)(什么是加法常数),并将所得之值循环左移若干位(若干位是随机的??),最后将所得结果加上a,b,c,d之一(这个之一也是随机的?)(一轮运算中这个之一是有规律的递增的..如下运算式),并回送至A,B,C,D,由此完成一次循环。(这个循环式对4个变量值进行计算还是对数据进行变换??) For i=0 to N/16 do For j=0 to 15 do Set X[i] to M[i*16+j] End AA = A BB=B CC=C DD=D //第一轮,令[ABCD K S I]表示下面的操作: //A=B+((A+F(B,C,D)+X[K]+T[I])<<

数据结构课程设计--哈希表实验报告

福建工程学院 课程设计 课程:算法与数据结构 题目:哈希表 专业:网络工程 班级:xxxxxx班 座号:xxxxxxxxxxxx 姓名:xxxxxxx 2011年12 月31 日 实验题目:哈希表 一、要解决的问题 针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。 基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。 运行的环境:Microsoft Visual C++ 6.0 二、算法基本思想描述 设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。建立哈希表并且将其显示出来。通过要查找的关键字用哈希函数计算出相应的地址来查找人名。通过循环语句调用数组中保存的数据来显示哈希表。 三、设计 1、数据结构的设计和说明 (1)结构体的定义 typedef struct //记录 { NA name; NA xuehao; NA tel; }Record;

{ Record *elem[HASHSIZE]; //数据元素存储基址 int count; //当前数据元素个数 int size; //当前容量 }HashTable; 哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。 2、关键算法的设计 (1)姓名的折叠处理 long fold(NA s) //人名的折叠处理 { char *p; long sum=0; NA ss; strcpy(ss,s); //复制字符串,不改变原字符串的大小写 strupr(ss); //将字符串ss转换为大写形式 p=ss; while(*p!='\0') sum+=*p++; printf("\nsum====================%d",sum); return sum; } (2)建立哈希表 1、用除留余数法构建哈希函数 2、用线性探测再散列法处理冲突 int Hash1(NA str) //哈希函数 { long n; int m; n=fold(str); //先将用户名进行折叠处理 m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数 return m; //并返回模值 }Status collision(int p,int c) //冲突处理函数,采用二次探测再散列法解决冲突{ int i,q; i=c/2+1; while(i=0) return q; else i=c/2+1; } else{ q=(p-i*i)%HASHSIZE; c++;

习题题5-1Hash函数答案说明

题5.1 a.分离链接法:将散列到同一个值的所有元素保留到一个链表中。 1)首先插入4371,h(4371)=4371(mod 10)=1,故插入1位置。 2)插入1323,h(1323)=1323(mod 10)=3,故插入3位置。 3)插入6173,h(6173)=6173(mod 10)=3,故插入3位置,此时发生冲突(与1323 插入同一位置),故添加一个链表并保存到此链表中。 4)插入4199,h(4199)=4199(mod 10)=9,故插入9位置。 5)插入4344,h(4344)=4344(mod 10)=4,故插入4位置。 6)插入9679,h(9679)=9679(mod 10)=9,故插入9位置,此时发生冲突(与4199 插入同一位置),故添加一个链表并保存到此链表中。 7)插入1989,h(1989)=1989(mod 10)=9,故插入9位置,此时发生冲突(与4199, 9679插入同一位置),故添加一个链表并保存到此链表中。 b.线性探测:hi(x)=(hash(x)+f(i))mod TableSize,其中f(i)=i,i为发 生冲突的次数,f(0)=0。相当于逐个探测散列表,最后将值散列

到最接近的一个空单元中(可以理解为,若发生冲突,则插入到下一个空单元中)。 1)首先插入4371,h0(4371)=(4371(mod 10)+f(0))mod 10=1,故插入1位置。 2)插入1323,h0(1323)=(1323(mod 10)+f(0))mod 10=3,故插入3位置。 3)插入6173,h0(6173)=(6173(mod 10)+f(0))mod 10=3,故插入3位置,此时发 生冲突(与1323插入同一位置)。 发生第一次冲突,计算h1(6173)=(6173(mod 10)+f(1))mod 10=4,故插入4位置。 4)插入4199,h0(4199)=(4199(mod 10)+f(0))mod 10=9,故插入9位置。 5)插入4344,h0(4344)=(4344(mod 10)+f(0))mod 10=4,故插入4位置,此时发 生冲突(与6173。插入同一位置)。 发生第一次冲突计算h1(4344)=(4344(mod 10)+f(1))mod 10=5,故插入5位置。 6)插入9679,h0(9679)=(9679(mod 10)+f(0))mod 10=9,故插入9位置,此时发 生冲突(与4199插入同一位置)。 发生第一次冲突计算h1(9679)=(9679(mod 10)+f(1))mod 10=0,故插入0位置。 7)插入1989,h0(1989)=(1989(mod 10)+f(0))mod 10=9,故插入9位置,此时发

什么是哈希函数

什么是哈希函数 哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。 1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。哈希值也称为输入数据的数字指纹(Digital Fingerprint)或消息摘要(Message Digest)等。Hash函数具备以下的性质: 2、给定输入数据,很容易计算出它的哈希值; 3、反过来,给定哈希值,倒推出输入数据则很难,计算上不可行。这就是哈希函数的单向性,在技术上称为抗原像攻击性; 4、给定哈希值,想要找出能够产生同样的哈希值的两个不同的输入数据,(这种情况称为碰撞,Collision),这很难,计算上不可行,在技术上称为抗碰撞攻击性; 5、哈希值不表达任何关于输入数据的信息。 哈希函数在实际中有多种应用,在信息安全领域中更受到重视。从哈希函数的特性,我们不难想象,我们可以在某些场合下,让哈希值来“代表”信息本身。例如,检验哈希值是否发生改变,借以判断信息本身是否发生了改变。` 怎样构建数字签名 好了,有了Hash函数,我们可以来构建真正实用的数字签名了。 发信者在发信前使用哈希算法求出待发信息的数字摘要,然后用私钥对这个数字摘要,而不是待发信息本身,进行加密而形成一段信息,这段信息称为数字签名。发信时将这个数字签名信息附在待发信息后面,一起发送过去。收信者收到信息后,一方面用发信者的公钥对数字签名解密,得到一个摘要H;另一方面把收到的信息本身用哈希算法求出另一个摘要H’,再把H和H’相比较,看看两者是否相同。根据哈希函数的特性,我们可以让简短的摘要来“代表”信息本身,如果两个摘要H和H’完全符合,证明信息是完整的;如果不符合,就说明信息被人篡改了。 数字签名也可以用在非通信,即离线的场合,同样具有以上功能和特性。 由于摘要一般只有128位或160位比特,比信息本身要短许多倍,USB Key或IC卡中的微处理器对摘要进行加密就变得很容易,数字签名的过程一般在一秒钟内即可完成。

哈 希 常 见 算 法 及 原 理

数据结构与算法-基础算法篇-哈希算法 1. 哈希算法 如何防止数据库中的用户信息被脱库? 你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 在实际开发中,我们应该如何用哈希算法解决问题? 1. 什么是哈希算法? 将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 2. 如何设计一个优秀的哈希算法? 单向哈希: 从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。 篡改无效: 对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。 散列冲突: 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小。 执行效率: 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算哈

希值。 2. 哈希算法的常见应用有哪些? 7个常见应用:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。 1. 安全加密 常用于加密的哈希算法: MD5:MD5 Message-Digest Algorithm,MD5消息摘要算法 SHA:Secure Hash Algorithm,安全散列算法 DES:Data Encryption Standard,数据加密标准 AES:Advanced Encryption Standard,高级加密标准 对用于加密的哈希算法,有两点格外重要,第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要小。 在实际开发中要权衡破解难度和计算时间来决定究竟使用哪种加密算法。 2. 唯一标识 通过哈希算法计算出数据的唯一标识,从而用于高效检索数据。 3. 数据校验 利用哈希算法对输入数据敏感的特点,可以对数据取哈希值,从而高效校验数据是否被篡改过。 4. 散列函数 1.如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?

哈希查找_数据结构实验报告

南昌航空大学实验报告 课程名称:数据结构实验名称:实验九查找 班级:学生姓名:学号: 指导教师评定:签名: 题目:编程实现哈希表的造表和查找算法。 要求:用除留余数法构造哈希函数,用二次探测再散列解决冲突。 一、需求分析 1.用户可以根据自己的需求输入一个顺序表(哈希表) 2.通过用除留余数法构造哈希函数,并用开放地址的二次探测再散列解决冲突。 3.在经过排序后显示该哈希表。 4.程序执行的命令包括: (1)创建哈希表(2)输出哈希表(3)二次探测再散列解决冲突 二、概要设计 ⒈为实现上述算法,需要顺序表的抽象数据类型: ADT Hash { 数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。 数据关系R:数据元素同属一个集合。 基本操作P: Creathash(&h) 操作结果:构造一个具有n个数据元素的哈希查找表h。 destroyhash(&h) 初始条件:哈希查找表h存在。 操作结果:销毁哈希查找表h。 displayhash(h) 初始条件:哈希查找表h存在。 操作结果:显示哈希查找表h。 hash(h,&k) 初始条件:哈希查找表h存在。 操作结果:通过除留余数法得到地址用k返回。 hash2 (i,&k) 初始条件:哈希查找表h存在存在,i是除留余数法得到的地址。 操作结果:返回二次探测再散列解决冲突得到的地址k。 search (h,key) 初始条件:哈希查找表h存在。 操作结果:查找表h中的key,若查找成功,返回其地址,否则返回

-1 insert (&h,key) 初始条件:哈希查找表h存在。 操作结果:若表h中没有key,则在h中插入key。 search1(h, key,&p) 初始条件:哈希查找表h存在。 操作结果:在表h中查找key,若没有,则返回p的插入的地址,否 则返回-1。 }ADT Hash 2. 本程序有三个模块: ⑴主程序模块 main(){ 初始化; { 接受命令; 显示结果; } } ⑵创建hash表的模块:主要建立一个哈希表; ⑶解决冲突模块:利用开放地址的二次探测再散列解决冲突; (4)输出哈希表模块:显示已创建哈希表。 三、详细设计 ⒈元素类型,结点类型 typedef struct { int key; }keytype; typedef struct { keytype elem[100]; int length; /*当前的长度*/ int size; /*哈希表的总长*/ }hashtable; /*全局变量*/ int a=0,b=0; /*哈希函数*/ 2.对抽象数据类型中的部分基本操作的伪码算法如下: /*哈希函数*/ int hash(hashtable *h,int k) { return k%h->size; }

SHA-1(安全哈希算法实现)

SHA-1(安全哈希算法实现) 如题,不知道sha-1的自己百度吧。 1 #include 2 #include //定义vector数组 3 #include //记录消息 4usingnamespace std; 5 6constint NUM = 8; //一个字由32比特(或者8个16进制数) 7constint BIT = 512; //消息认证码要以512比特一组 8 9//字常量 10string H0 = "67452301"; 11string H1 = "EFCDAB89"; 12string H2 = "98BADCFE"; 13string H3 = "10325476"; 14string H4 = "C3D2E1F0"; 15 16//定义SHA1(安全哈希算法)类 17class SHA1 18 { 19public: 20//将一个字符串形式的字转化为vector数组 21 vector hex_into_dec(string word); 22 23//将vector转化为string字符串形式 24string num_into_message(vector A); 25 26//两个字X和Y的逻辑"和" 27 vector word_AND(vector A,vector B); 28 29//两个字X和Y的逻辑"或" 30 vector word_OR(vector A,vector B); 31 32//两个字X和Y的逻辑"异或" 33 vector word_XOR(vector A,vector B); 34 35//两个字X和Y的逻辑"补" 36 vector word_COMPLEMENT(vector A); 37 38//两个字X和Y的摸2^32整数加 39 vector word_ADD(vector A,vector B); 40

哈 希 常 见 算 法 及 原 理

计算与数据结构篇 - 哈希算法 (Hash) 计算与数据结构篇 - 哈希算法 (Hash) 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 构成哈希算法的条件: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。 哈希算法的应用(上篇) 安全加密 说到哈希算法的应用,最先想到的应该就是安全加密。最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。 除了这两个之外,当然还有很多其他加密算法,比如 DES(Data Encryption Standard,数据加密标准)、AES(Advanced Encryption Standard,高级加密标准)。

前面我讲到的哈希算法四点要求,对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 不过,即便哈希算法存在散列冲突的情况,但是因为哈希值的范围很大,冲突的概率极低,所以相对来说还是很难破解的。像 MD5,有 2^128 个不同的哈希值,这个数据已经是一个天文数字了,所以散列冲突的概率要小于 1-2^128。 如果我们拿到一个 MD5 哈希值,希望通过毫无规律的穷举的方法,找到跟这个 MD5 值相同的另一个数据,那耗费的时间应该是个天文数字。所以,即便哈希算法存在冲突,但是在有限的时间和资-源下,哈希算法还是被很难破解的。 对于加密知识点的补充,md5这个算法固然安全可靠,但网络上也有针对MD5中出现的彩虹表,最常见的思路是在密码后面添加一组盐码(salt), 比如可以使用md5(1234567.'2019@STARK-%$#-idje-789'),2019@STARK-%$#-idje-789 作为盐码起到了一定的保护和安全的作用。 唯一标识(uuid) 我们可以给每一个图片取一个唯一标识,或者说信息摘要。比如,我们可以从图片的二进制码串开头取 100 个字节,从中间取 100 个字节,从最后再取 100 个字节,然后将这 300 个字节放到一块,通过哈希算法(比如 MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中,这样就可以减少很多工作量。

【免费下载】hash算法实验

实验课程名称:电子商务安全管理实验项目名称1:DES 、RSA 和Hash 算法的实现实验成绩 试验者 王秀梅专业班级1105441 组别同组者无实验的目的 (1) 掌握常用加密处理软件的使用方法。 (2) 理解DES 、RSA 和Hash 算法的原理。 (3) 了解MD5算法的破解方法。实验环境 (1) 装有Windows XP/2003操作系统的PC 机1台。 (2) MixedCS 、RSATool 、DAMN_HashCalc 、MD5Crack 工具软件各1套。实验步骤1、请参考实验指导PPT 。并在最后写实验心得体会。2、将实验电子版提交FTP——1105441电子商务安全管理——第一次实验报告,文件名为“学号(1105441)+姓名+实验一”。 实验过程记录 (1) 对称加密算法DES 的实现 步骤1:双击运行MixedCS.exe 程序,打开的程序主界面步骤2:单击“浏览文件”按钮,选择要进行DES 加密的源文件,选择完成后在“输出文件”文本框中会自动出现默认的加密后的文件名。步骤3:选中“DES 加密”单选按钮,在“DES 密钥”文本框中输入5个字符 (区分大小、管路敷设技术通过管线敷设技术,不仅可以解决吊顶层配置不规范问题,而且可保障各类管路习题到位。在管路敷设过程中,要加强看护关于管路高中资料试卷连接管口处理高中资料试卷弯扁度固定盒位置保护层防腐跨接地线弯曲半径标高等,要求技术交底。管线敷设技术中包含线槽、管架等多项方式,为解决高中语文电气课件中管壁薄、接口不严等问题,合理利用管线敷设技术。线缆敷设原则:在分线盒处,当不同电压回路交叉时,应采用金属隔板进行隔开处理;同一线槽内,强电回路须同时切断习题电源,线缆敷设完毕,要进行检查和检测处理。、电气课件中调试对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料试卷相互作用与相互关系,根据生产工艺高中资料试卷要求,对电气设备进行空载与带负荷下高中资料试卷调控试验;对设备进行调整使其在正常工况下与过度工作下都可以正常工作;对于继电保护进行整核对定值,审核与校对图纸,编写复杂设备与装置高中资料试卷调试方案,编写重要设备高中资料试卷试验方案以及系统启动方案;对整套启动过程中高中资料试卷电气设备进行调试工作并且进行过关运行高中资料试卷技术指导。对于调试过程中高中资料试卷技术问题,作为调试人员,需要在事前掌握图纸资料、设备制造厂家出具高中资料试卷试验报告与相关技术资料,并且了解现场设备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。 、电气设备调试高中资料试卷技术电力保护装置调试技术,电力保护高中资料试卷配置技术是指机组在进行继电保护高中资料试卷总体配置时,需要在最大限度内来确保机组高中资料试卷安全,并且尽可能地缩小故障高中资料试卷破坏范围,或者对某些异常高中资料试卷工况进行自动处理,尤其要避免错误高中资料试卷保护装置动作,并且拒绝动作,来避免不必要高中资料试卷突然停机。因此,电力高中资料试卷保护装置调试技术,要求电力保护装置做到准确灵活。对于差动保护装置高中资料试卷调试技术是指发电机一变压器组在发生内部故障时,需要进行外部电源高中资料试卷切除从而采用高中资料试卷主要保护装置。

HASH函数

密码学 (第十三讲) HASH函数 张焕国 武汉大学计算机学院

目录 密码学的基本概念 1、密码学 2、古典 、古典密码 3、数据加密标准( ) DES) 、数据加密标准(DES 4、高级 ) AES) 数据加密标准(AES 高级数据加密标准( 5、中国商用密码( ) SMS4) 、中国商用密码(SMS4 6、分组密码的应用技术 7、序列密码 8、习题课:复习对称密码 、公开密钥密码(11) 9、公开密钥密码(

目录 公开密钥密码(22) 10 10、 11、数字签名(1) 12、数字签名(2) 13、 、HASH函数 13 14 14、 15、 15 PKI技术 16 16、 、PKI 17、习题课:复习公钥密码 18、总复习

一、HASH 函数函数的概念的概念 1、Hash Hash的作用的作用 ?Hash Hash码也称报文摘要码也称报文摘要。。 ?它具有极强的错误检测能力错误检测能力。。 ?用Hash Hash码作码作MAC ,可用于认证认证。。 ?用Hash Hash码辅助码辅助数字签名数字签名。。 ?Hash Hash函数可用于函数可用于保密保密。。

一、HASH 函数的概念 2、Hash Hash函数的定义函数的定义 ①Hash Hash函数将任意长的数据函数将任意长的数据M 变换为定长的码h , 记为记为::h=HASH(M)h=HASH(M)或或h=H(M)h=H(M)。。 ②实用性:对于给定的数据对于给定的数据M M ,计算,计算h=HASH(M)h=HASH(M)是是 高效的。 ③安全性安全性:: ? 单向性:对给定的对给定的Hash Hash值值h ,找到满足H(x)H(x)==h 的x 在 计算上是不可行的计算上是不可行的。。 否则否则,,设传送数据为设传送数据为C=C=<<M ,H(M||K )>,K 是密钥。攻击者可以截获攻击者可以截获C,C,求出求出Hash 函数的逆函数的逆,,从而得出 M||S =H -1(C),然后从M 和M ||K即可即可得出得出K。

哈 希 常 见 算 法 及 原 理 ( 2 0 2 0 )

哈希算法乱谈(摘自知乎) 最近【现场实战追-女孩教-学】初步了解了Hash算法的相关知识,一些人的见解让我能够迅速的了解相对不熟悉的知识,故想摘录下来,【QQ】供以后温故而知新。 HASH【⒈】算法是密码学的基础,比较常用的有MD5和SHA,最重要的两【О】条性质,就是不可逆和无冲突。 所谓不【1】可逆,就是当你知道x的HASH值,无法求出x; 所谓无【б】冲突,就是当你知道x,无法求出一个y,使x与y的HA【9】SH值相同。 这两条性【⒌】质在数学上都是不成立的。因为一个函数必然可逆,且【2】由于HASH函数的值域有限,理论上会有无穷多个不同的原始值【6】,它们的hash值都相同。MD5和SHA做到的,是求逆和求冲突在计算上不可能,也就是正向计算很容易,而反向计算即使穷尽人类所有的计算资-源都做不到。 顺便说一下,王小云教授曾经成功制造出MD5的碰撞,即md5(a) = md5(b)。这样的碰撞只能随机生成,并不能根据一个已知的a求出b(即并没有破坏MD5的无冲突特性)。但这已经让他声名大噪了。 HASH算法的另外一个很广泛的用途,就是很多程序员都会使用的在数据库中保存用户密码的算法,通常不会直接保存用户密码(这样DBA就能看到用户密码啦,好危险啊),而是保存密码的HASH值,验

证的时候,用相同的HASH函数计算用户输入的密码得到计算HASH值然后比对数据库中存储的HASH值是否一致,从而完成验证。由于用户的密码的一样的可能性是很高的,防止DBA猜测用户密码,我们还会用一种俗称“撒盐”的过程,就是计算密码的HASH值之前,把密码和另外一个会比较发散的数据拼接,通常我们会用用户创建时间的毫秒部分。这样计算的HASH值不大会都是一样的,会很发散。最后,作为一个老程序员,我会把用户的HASH值保存好,然后把我自己密码的HASH值保存到数据库里面,然后用我自己的密码和其他用户的用户名去登录,然后再改回来解决我看不到用户密码而又要“偷窥”用户的需要。最大的好处是,数据库泄露后,得到用户数据库的黑客看着一大堆HASH值会翻白眼。 哈希算法又称为摘要算法,它可以将任意数据通过一个函数转换成长度固定的数据串(通常用16进制的字符串表示),函数与数据串之间形成一一映射的关系。 举个粒子,我写了一篇小说,摘要是一个string:'关于甲状腺精灵的奇妙冒险',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了我的文章,并发表为'关于JOJO的奇妙冒险',我可以立即发现我的文章被篡改过,因为根据'关于JOJO的奇妙冒险'计算出的摘要不同于原始文章的摘要。 可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡

哈希表实验报告(20200623044247)

数据结构实验报告四一一哈希表查找名字(字符串) 实验题目:哈希表查找名字(字符串) 实验目标: 输入一组名字(至少50个),将其保存并利用哈希表查找。输出哈希查找冲突次数,哈希表负载因子、查找命中率。 数据结构: 哈希表和数组(二维)。二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法, 用于存储名字(字符串)对应的关键字并实现对名字(字符串)的查找。 需要的操作有: 1.关键字求取(主函数中两次出现,未单独编为函数) 关键字key=abs (字符串首位ASCII码值-第二位ASCII码值+第([n]+i )位ASCII码值撮后一 位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值的函数)。 2.处理关键字的哈希函数(Hash) 利用平方取中法求关键值key在哈希表中的位置。公式add=(key*key)%1000/LENGTH(add 为key在哈希表中的地址)。 int Hash(i nt key) { return((key*key)/1000%LENGTH); } 3.处理哈希表中冲突的函数(Collision 利用线性探测再散列处理冲突,利用全局变量count统计冲突次数。 int Collision(int key,int Hashtable[]) { int i; for(i=1;i<=LENGTH;i++) { if(Hashtable[(Hash(key)+i)%LENGTH]==-1) return((Hash(key)+i)%LENGTH); coun t++; } } 4.哈希表初始化(InitHash) void InitHash(int Hashtable[]) { int i; for(i=0;i

安全哈希函数简介

安全哈希函数 一、哈希函数定义 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 二、性质 基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。但反过来不同的原始输入不一定能得到相同的散列值,即发生了碰撞。哈希函数的定义域无限,而值域有限,因此理论上来讲每个哈希函数都可以找到碰撞。 一个“优良”的hash函数f 应当满足以下三个条件: 任意y,找x,使得f(x)=y,非常困难。此为哈希函数的单向性,或抗原像性(preimage resistant)。 给定x1,找x2,使得f(x1)=f(x2),非常困难。弱抗碰撞性,或抗第二原像性(second preimage resistant)。 找x1,x2,使得f(x1)=f(x2),非常困难。强抗碰撞性(Collision Resistant)。 三、分类 哈希函数有字符串哈希函数,一般用于数据存储;安全哈希函数 安全哈希函数的分类: 根据安全水平: 弱抗碰撞哈希函数和强抗碰撞哈希函数,后者是包含前者的。 在保护口令的应用中,只需弱抗碰撞性就够了,但在数字签名中,必须有强抗碰撞性。

根据是否使用密钥: 带密钥的哈希函数:消息的散列值由只有通信双方知道的秘密密钥K来控制,此时散列值称作MAC(Message Authentication Code) 不带密钥的哈希函数:消息的散列值的产生无需使用密钥,此时散列值称作MDC(Message Detection Code 四、哈希函数的用途 数字签名 哈希函数可以提高签名的速度,减少运算,又可以不泄露签名所对应的消息,还可以将消息的签名与加密变换分开处理。 校验 可以校验数据是否被篡改。传输消息之前对消息进行哈希变换,接收者也进行相同的哈希变换,若两个哈希值相同,可以认为消息在传输过程中没有被篡改。 快速访问 散列表的寻址时间复杂度为O(1),在数据存储中运用较多,这里不作详述。 安全访问认证 MD5广泛用于操作系统的登陆认证上,如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。 伪随机数生成

相关文档
最新文档