拉链法解决Hash节点冲突问题
<?php
/*
* hash::拉链法解决hash节点存储冲突问题
* ::2014-07-02
* ::Small_Kind
*/
class small_hash { private $size = 20;//hash节点大小
private $zone = null;//hash空间 //实例化函数,并设置一个初始hash节点大小,如果节点大小为null,则为默认节点大小
final public function __construct($size = null){
if(!is_null($size))$this->size = $size;//
$this->zone = new SplFixedArray($this->size);//
} //times33::计算key的hash值,并进行节点大小的取模工作
//::实现流程1、计算key长度2、循环长度,并将每个字符转换成asicc码后*33
final private function hash_times33($key){
if(empty($key))return false;//key==>empty
$strlen = strlen($key);
$hash_val = 0;
for($i=0;$i<$strlen;$i++){
$hash_val += ($hash_val * 33) + ord($key{$i});
}
return ($hash_val & 0x7FFFFFFF) % $this->size;
} //set::通过拉链法进行key->value对应的值设置
final public function set($key,$value){
if(empty($key) || empty($value))return false;//empty
$index = $this->hash_times33($key);
//如果不存在此节点的数据,则向该节点添加第一组数据
if(isset($this->zone[$index])){
//key、value、拉链对象[当该节点已存在1个或多组数据的时候,将之前的数据赋值给最新的一组data]
//也就是说在查询时候相当于一种后进先出的原则,不断将最新的数据放在最前面,以此形成一种阶梯形式
$data = array($key,serialize($value),$this->zone[$index]);
}else{
$data = array($key,serialize($value),null);//key、value、拉链对象[当该节点是第一次有值的时候,拉链对象为null]
}
return $this->zone[$index] = $data;//最后将完整的data赋值给该节点
} //get::通过key获取对应hash后对应的的节点,循环该对象节点,然后通过key值匹配节点中的key,并将值进行返回
final public function get($key){
$index = $this->hash_times33($key);
$handle = new stdClass();//初始化一个对象
$handle = (array)$this->zone[$index];//查询该key对应的节点
return $this->for_match($key,$handle);//将对象数组送入匹配函数进行迭代查询
} //for_match::通过key对handle进行迭代查询,查询到了即返回,没有查询到则返回一个false
final public function for_match($key,$handle){
if(is_array($handle)){
if($handle[0] == $key){
return unserialize($handle[1]);//如果找到值了,则对值进行返回
}else{
return $this->for_match($key,$handle[2]);//否则继续迭代该方法
}
}
}
} $hand = new small_hash();
$hand->set('Libin','WWW.BAIDU.COM');
$hand->set('d24150ddd','WWW.PHP.COM');
var_dump($hand->get('Libin'));
var_dump($hand->get('d24150ddd'));
?>
拉链法解决Hash节点冲突问题的更多相关文章
- 拉链法解决hashtable冲突问题
拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字 ...
- 链表法解决hash冲突
/* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...
- java解决hash算法冲突
看了ConcurrentHashMap的实现, 使用的是拉链法. 虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的.当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时.冲突就 ...
- 解决Hash碰撞冲突方法总结
Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰 ...
- 解决Hash碰撞冲突的方法
Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰 ...
- HashMap的底层实现以及解决hash值冲突的方式
class HashMap<K,V> extends AbstractMap<K,V> HashMap put() HashMap get() 1.put() HashMa ...
- hash算法与拉链法解决冲突
<?php class HashNode { public $key; public $value; public $nextNode; public function __construct( ...
- 【Java集合学习】HashMap源码之“拉链法”散列冲突的解决
1.HashMap的概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io ...
- poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 30529 Accep ...
随机推荐
- a code snip
import java.util.ArrayList; import java.util.HashMap; import java.util.regex.Matcher; import java.ut ...
- CF Fox And Names (拓扑排序)
Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- CF Covered Path (贪心)
Covered Path time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- [改善Java代码]异常只为异常服务
异常原本是正常逻辑的补充,但是有时候会被当做主逻辑使用.看如下代码: public class Client { enum Color { Red, Blue; } public static voi ...
- android 获取IMEI号
android 获取 imei号码 核心代码: Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId( ...
- union on
UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列 ...
- asp网站发布步骤总结
1.在VS2012中打开索要发布的网站,初始页可重命名为index.html或default.apx. 2.点击 生成>生成“网站”,然后“发布网站”. 3.进行发布设置: (1 配置文件 ( ...
- 如何将 select top 4 id from table1 赋值 给 declare @id1 int,@id2 int,@id3 int,@id4 int
declare @id1 int,@id2 int,@id3 int,@id4 int ),) select @sickcode = sickcode,@sfrq =sfrq from tablena ...
- Android之日历触屏测试
结构: 查看运行效果点这里 DiaryTest.apk下载 BaseCalendar: package com.cdp.Activity; import java.util.Calendar; imp ...
- pl/sql developer 中文字段显示乱码
在windows中创建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,然后重新启动 pl/sql developer,这样 ...