完美哈希函数(Perfect Hash Function)

原创 2007年08月05日 18:09:00
  
什么是完美哈希函数
 
完美哈希函数(Perfect Hash Function,简称PHF就是没有冲突的哈希函数,也就是,函数 H 将 N 个 KEY 值映射到 M 个整数上,这里 M>=N ,而且,对于任意的 KEY1 ,KEY2 ,H( KEY1 ) != H( KEY2 ) ,并且,如果 M = = N ,则 H 是最小完美哈希函数(Minimal Perfect Hash Function,简称MPHF
 
什么时候使用PHFMPHF
 
通常情况下,PHF或MPHF是针对静态集合的。也就是,在使用PHF或MPHF时,所有的 KEY 值是事先已知并且固定的。不过,这里有针对动态集合的一个算法(我没有仔细看,不敢肯定)。
 
使用PHFMPHF的一般流程
 
1.         (准备阶段)将已知的所有的 KEY 值传给PHF或MPHF生成算法,生成PHF或MPHF以及相应的数据;
2.         (使用阶段)调用已有的PHF或MPHF以及相应的数据快速计算哈希值并进行相应的操作。
其实在实际使用中我们只关心步骤2,但步骤1的生成算法却是PHF或MPHF的关键。
 
PHFMPHF生成程序库
 
GNU的完美哈希函数生成程序,可以生成PHF和MPHF,生成MPHF时和输入数据以及参数设置的关系比较大。使用的应该是比较简单的算法,生成的效率不高,当数据量大时,程序就没什么反应了。生成的结果是代码(里面包含有数据,直接组织在代码里),移植性非常好。很多编译器对保留字的处理都采用gperf来建立完美哈希函数。Windows版的可执行文件可以从这里下载,源代码可以从这里下载,一篇介绍论文在这里,说明书在这里,说明书中文翻译在这里
易用性:                            5
稳定性:                            5
移植性:                            5
效率(针对大数据量):     2
MPHF:                             2
 
巴西的这个哥们Fabiano C. Botelho发了很多MPHF方面的论文。CMPH应该他和其他几个人开发的开源的生成MPHF的程序库。这里面封装了4个算法,而且设计了一个程序框架(搞不懂他们为什么要设计这样一个框架,用MPHF的人不会像他们做研究那样会一次使用那么多个算法的,而这样一个框架明显增加了使用的难度)。里面有几个算法是针对大数据量的,但简单试了试,发现并不像他们论文里宣称的那样高效,而且由于是一个框架,生成的MPHF并不能直接脱离他们的环境来使用。这里是他们在SourceForge上的链接。
易用性:                            3
稳定性:                            2
移植性:                            2
效率(针对大数据量):     2
MPHF:                             5
 
又一个牛人写的生成MPHF的算法,注意了,他写这个纯粹是为了好玩,考!
简单试了试,可以直接生成代码,但不是很好用,针对大数据量效率也不行。
易用性:                            3
稳定性:                            3
移植性:                            4
效率(针对大数据量):     3
MPHF:                             5
 
又又一个牛人写的生成MPHF的算法,比较好用,可以处理大数据量的集合,而且比较有特色的是关键字不仅仅可以是字符串,还可以是整数等。
易用性:                            5
稳定性:                            5
移植性:                            4
效率(针对大数据量):     5
MPHF:                             5
 
以上都是用C/C++来实现的PHFMPHF生成程序考,这是一个用Python实现的MPHF生成程序。还是比较好用的,遗憾的是对大数据量效率不行。
易用性:                            5
稳定性:                            5
移植性:                            4
效率(针对大数据量):     3
MPHF:                             5
 
PHFMPHF生成算法
我一贯坚持的是拿来主义(只要不存在法律和道德风险),所以对PHFMPHF的生成算法我只是浅尝辄止,不敢在这里唧唧歪歪。下面给出一些链接,想研究这些算法好好看这些论文吧。论文按大概时间顺序排列,最新的在最前面。
 

常见的hash函数 :-D 非常经典!!

常见的Hash算法 2011-04-08 22:31 1999人阅读 评论(6) 收藏 举报 简介哈希方法学哈希函数和素数位偏向各种形式的哈希常用的哈希函数各版本哈希代码下载 ...
  • mycomputerxiaomei
  • mycomputerxiaomei
  • 2012年06月07日 11:16
  • 63995

散列函数(哈希函数,Hash Function)

说明          散列的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。 简单的说,hash函数就是把任意长的输入字符串变化成固定长的输...
  • ywok526
  • ywok526
  • 2014年08月13日 18:41
  • 9794

Hash函数经典用法

撰写这篇文章之前,先牢骚几句。程序员除了数据结构与算法,什么也不属于自己---记得哪个NB人物曾经说过这样的话。的确,程序员水平高低如何,很大程度上取决于基本功是否扎实。高级程序员与普通码农的区别在我...
  • sunjunior
  • sunjunior
  • 2015年05月28日 22:11
  • 6276

hash算法和常见的hash函数

      Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre--mage),通过散列算法,变换成固定长度的输出,该输出就是散列值。      这种转...
  • lyflower
  • lyflower
  • 2008年06月12日 16:13
  • 15624

重温数据结构:哈希 哈希函数 哈希表

点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 在学习 HashMap 前,我们先来温习下 Hash(哈希) 的概念。 什么是 HashHash(哈希),又称“散列”...
  • u011240877
  • u011240877
  • 2016年10月27日 00:49
  • 5557

hash函数的基本知识

Hash函数也称为散列表,是一种常用的数据结构。哈希表优点:可以提供快速插入和查找操作,无论有多少数据项,插入与查找只需接近常量的实际:O(1)时间级。而且编程很容易实现。哈希表的缺点:它是基于数组的...
  • u013074465
  • u013074465
  • 2015年04月15日 15:06
  • 2875

hash函数的完全解析

  • 2014年04月18日 22:31
  • 320KB
  • 下载

hash函数的简单介绍

HASH函数 应用Hash函数  作者:冲处宇宙 时间:2007.1.25 计算理论中,没有Hash函数的说法,只有单向函数的说法。...
  • youyiyang
  • youyiyang
  • 2015年09月17日 16:05
  • 3046

深入理解HashMap(及hash函数的真正巧妙之处)

深入理解HashMap(及hash函数的真正巧妙之处) 博客分类:  Java 数据结构算法编程  原文地址:http://www.iteye.com/topic/5394...
  • qa962839575
  • qa962839575
  • 2015年04月05日 18:24
  • 3787

深入理解HashMap(及hash函数的真正巧妙之处)

原文地址:http://www.iteye.com/topic/539465   /**      *@author annegu      *@date 2009-12-02   ...
  • jiary5201314
  • jiary5201314
  • 2016年05月17日 22:23
  • 12945
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:完美哈希函数(Perfect Hash Function)
举报原因:
原因补充:

(最多只允许输入30个字)