2015-05-27
PHP核心技术与最佳实践之Hash算法
Hash表又称散列表,通过把关键字Key映射到数组中的一个位置来访问记录,以加快查找速度。这个映射函数称为Hash函数,存放记录的数组称为Hash表。
1. Hash函数
作用是把任意长度的输入,通过Hash算法变换成固定长度的输出,该输出就是Hash值。这种转换是一种压缩映射,也就是Hash值得空间通常远小于输入的空间,不输入可能会散列成相同的输出,而不可能从Hash值来唯一的确定输入值。
一个好的hash函数应该满足以下条件:每个关键字都可以均匀的分布到Hash表任意一个位置,并与其他已被散列到Hash表中的关键字不发生冲突。这是Hash函数最难实现的。
2. Hash算法
1) 直接取余法
直接取余法比较简单,直接用关键字k除以Hash表的大小m取余数,算法如下:
H(k) = k mod m
例如:Hash表的大小为m=12,所给关键字为k=100,则h(k) = 4.这种算法是一个求余操作,速度比较快。
2) 乘积取整法
乘积取整法首先使用关键字k乘以一个常数A(0
H(k) = floor (m*(kA mod 1))
其中,kA mod1表示kA的小数部分,floor是取整操作。
当关键字是字符串的时候,就不能用上面的Hash算法。因为字符串是由字符组成,所以可以把字符串所有的字符的ASCII码加起来得到一个整数,然后再按照上面的Hash算法去计算即可。
算法如下:
Function hash($key,$m){
$strlen= strlen($key);
$hashval= 0;
For($i=0;$i< $strlen;$i++){
$hashval+=ord($key{$I});
}
Return $hashval % $m;
}
3) 经典Hash算法Times33
Unsigned int DJBHash(char *str){
Unsignedint hash = 5381;
While(*str){
Hash+=(hash <<5)+(*str++);
}
Return (hash &0x7FFFFFFF)
}
算法思路就是不断乘以33,其效率和随机性都非常好,广泛运用于多个开源项目中,如Apache、Perl和PHP等。
3. Hash表
Hash表的时间复杂度为O(1),Hash表结构可用图表示:

要构造一个Hash表必须创建一个足够大的数组用于存放数据,另外还需要一个Hash函数把关键字Key映射到数组的某个位置。
Hash表的实现步骤:
1) 创建一个固定大小的数组用于存放数据。
2) 设计Hash函数。
3) 通过Hash函数把关键字映射到数组的某个位置,并在此位置上进行数据存取。
4. 使用PHP实现Hash表
首先创建一个HashTable类,有两个属性$buckets和$size。$buckets用于存储数据的数组,$size用于记录$buckets数组大小。然后在构造函数中为$buckets数组分配内存。代码如下:
ClassHashTable{
Private$buckets;
Private$size =10;
Publicfunction __construct(){
$this-> buckets =new SplFixedArray($this->size);
}
}
?>
在构造函数中,为$buckets数组分配了一个大小为10的数组。在这里使用了SPL扩展的SplFixedArray数组,不是一般的数组(array)
这是因为SplFixedArray数组更接近于C语言的数组,而且效率更高。在创建其数组时需要为其提供一个初始化的大小。
注意:要使用SplFixedArray数组必须开启SPl扩展。如果没有开启,可以使用一般的数组代替。
接着为Hash表指定一个Hash函数,为了简单起见,这里使用最简单的Hash算法。也就是上面提到了把字符串的所有字符加起来再取余。代码如下:
Public Function hashfunc($key){
$strlen= strlen($key);
$hashval= 0;
For($i=0;$i< $strlen;$i++){
$hashval+=ord($key{$I});
}
Return $hashval % $this->size;
}
有了Hash函数,就可以实现插入和查找方法。插入数据时,先通过Hash函数计算关键字所在Hash表的位置,然后把数据保存到此位置即可。代码如下:
Public function insert($key,$val){
$index= $this -> hashfunc($key);
$this-> buckets[$index] = $val;
}
查找数据方法与插入数据方法相似,先通过Hash函数计算关键字所在Hash表的位置,然后返回此位置的数据即可。代码如下:
Public function find($key){
$index= $this -> hashfunc($key);
Return$this ->buckets[$index];
}
至此,一个简单的Hash表编写完成,下面测试这个Hash表。代码清单如下:
$ht= new HashTable();
$ht->insert(‘key1’,’value1’);
$ht->insert(‘key2’,’value2’);
Echo$ht ->find(‘key1’);
Echo$ht ->find(‘key2’);
?>
完整代码:#hash.php
buckets =new SplFixedArray($this->size); } PublicFunction hashfunc($key){ $strlen= strlen($key); $hashval= 0; For($i=0;$i< $strlen;$i++){ $hashval+=ord($key{$i}); } return$hashval % $this->size; } Publicfunction insert($key,$val){ $index= $this -> hashfunc($key); $this-> buckets[$index] = $val; } Publicfunction find($key){ $index= $this -> hashfunc($key); Return$this ->buckets[$index]; } } $ht = newHashTable(); $ht->insert('key1','value1'); $ht->insert('key2','value2'); Echo $ht->find('key1'); Echo $ht->find('key2'); ?>
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
6
将视频设置为Android手机开机动画的教程
12-11
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
04-12
常用dos命令及语法
2014-09-27
PHP中include和require区别之我见
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
php递归返回值的问题
2014-09-05
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
学ug编程如何快速入门?
2022-03-17
PHP数组函数array
2014-09-05
学习使用C语言/C++编程的7个步骤!超赞~
2022-03-20
零基础的初学者怎样学习java,或者应该先学什么?
2022-03-21
收割者剑客传奇免谷歌汉化版下载v2.0.1 安卓版
其它手游 40.19MB
下载
reaper收割者破解版下载v2.0.1 安卓完美版
其它手游 40.19MB
下载
reaper汉化版下载v2.0.1 安卓中文版
其它手游 40.19MB
下载
死神苍白剑士的传说中文版(Reaper)下载v2.0.1 安卓版
其它手游 40.19MB
下载
宝宝巴士迷宫小镇下载v9.89.99.01 官方安卓版
其它手游 113.4MB
下载
宝宝迷宫大作战游戏下载v9.89.99.01 安卓版
其它手游 113.4MB
下载
宝宝巴士干净的妙妙游戏下载v9.89.99.00 安卓版
其它手游 76.43MB
下载
妙妙爱干净宝宝巴士下载v9.89.99.00 安卓版
其它手游 76.43MB
下载翻炒厨师游戏下载v2.1.3 安卓版
下载
维塔战士游戏最新版下载v976 安卓版
下载
泡泡小镇城堡游戏下载v1.1.5 安卓完整版
下载
3d蚊子模拟器游戏最新版下载v2023.08.22 安卓版
下载
超级机器人英雄游戏下载v1.1.3 安卓版
下载
robot super游戏下载v1.1.3 安卓版
下载
zombie tsunami游戏下载v4.6.8 安卓版
下载
2026僵尸尖叫正版下载v4.6.8 安卓官方版
下载