返回列表 发帖

盘点哈希竞猜游戏常见的几种哈希算法和规则

  本文简略的介绍了一番实际应用中的用于查找的Hash算法(16hash.vip)。Hash算法除了应用于这个方面以外,另外一个著名的应用是巨型字符串匹配(这时的Hash算法叫做:rollinghash,因为它必须可以滚动的计算)。设计一个真正好的Hash算法并不是一件容易的事情。作为应用来说,选择一个适合的算法是最重要的。

  

  基于高速访问设计的哈希表也是一种典型的“空间换时间”方法。顾名思义,数据结构可以理解为一个线性表,但其中的元素不是密切排列的,但可能会有间隙。

  哈希表基于关键码值;并直接访问数据结构。也就是说,它通过将键值映射到表中的某个位置来访问记录,以加快查找速度。这个映射函数称为哈希函数,存储记录的数组称为哈希表。

  Hash函数还有另外的含义。实际中的Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。除此以外,Hash函数往往应用于查找上。所以,在考虑使用Hash函数之前,需要明白它的几个限制:

  1.Hash的主要原理就是把大范围映射到小范围;所以,你输入的实际值的个数必须和小范围相当或者比它更小。不然冲突就会很多。

  2.由于Hash逼近单向函数;所以,你可以用它来对数据进行加密。

  3.不同的应用对Hash函数有着不同的要求;比如,用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。

  应用于加密的Hash函数已经探讨过太多了,在作者的博客里面有更详细的介绍。所以,本文只探讨用于查找的Hash函数。

  Hash函数应用的主要对象是数组(比如,字符串),而其目标一般是一个int类型。以下我们都按照这种方式来说明。

  

  哈希函数可以使数据序列的访问过程更加快速精确。通过哈希函数,可以更慢地定位数据元素:

  1直接寻址方法:以关键性字的值或关键性字的线性函数作为哈希地址。一、即H(key)=key或H(key)=a?key+b,其中A和B是常数(这种散列函数称为自函数)

  2数值分析方法:在分析一组数据时,例如一组员工的出生日期,我们发现出生日期的后几个数字大致相同。在这种情况之下,发生冲突的可能性将非常大。然而,我们发现出生日期的最终几位数字表示月份和详细日期间存在很大差异。如果使用下列数字形成哈希地址,则冲突的概率将明显降低。因此,数值分析的方法是找出数字规则,并尽可能余地使用这些数据来构造冲突概率较低的哈希地址

  3。平方取中法:以关键性字平方后的下方数字作为哈希地址

  4。折叠方法:将关键性字切成数个数字相近的部分。最终一部分可以有有所不同的数字,然后将这些部分的叠加和(去掉进位)作为哈希地址

  5。随机数法:选择一个随机函数,将关键性字的随机值作为哈希地址,常用于关键性字长度有所不同的情况

  6。除留余数法:将关键性字的余数除以不大于哈希表长度m的数字P作为哈希地址。即H(key)=keyMODp,p<=m。它不仅可以间接取关键性字模块,还可以进行折叠、平方取中操作后取模块。P的选择非常关键。它通常采用素数或M。如果P选择失当,容易生成同义词。

  获取所需内容:比特币使用两种哈希算法。一种是对数据进行两次SHA-256计算。这种算法在比特币协议之中通常称为hash256或dhash。

  另一种算法是先计算SHA-256,然后计算ripemd160。这种算法在比特币协议之中通常被称为hash160。

  我发现很多人只知道MD5之中的哈希函数。例如,当数据库被划分为数据库和表时,可能需要对主机名进行哈希运算,然后获取模块。MD5在这里太浪费CPU了。您应该知道,MD5将平均值对每个字节执行6.8个操作。

  如果您只需要使用离散类型的哈希,那么可以使用更慢的哈希算法,例如FNV哈希,它是对内存的顺序访问,CPU缓存友谊,并且比MD5效率更低。

  

返回列表