<?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节点冲突问题的更多相关文章

  1. 拉链法解决hashtable冲突问题

    拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字 ...

  2. 链表法解决hash冲突

    /* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...

  3. java解决hash算法冲突

    看了ConcurrentHashMap的实现, 使用的是拉链法. 虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的.当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时.冲突就 ...

  4. 解决Hash碰撞冲突方法总结

    Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰 ...

  5. 解决Hash碰撞冲突的方法

    Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰 ...

  6. HashMap的底层实现以及解决hash值冲突的方式

    class HashMap<K,V> extends AbstractMap<K,V> HashMap  put() HashMap  get() 1.put() HashMa ...

  7. hash算法与拉链法解决冲突

    <?php class HashNode { public $key; public $value; public $nextNode; public function __construct( ...

  8. 【Java集合学习】HashMap源码之“拉链法”散列冲突的解决

    1.HashMap的概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io ...

  9. poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accep ...

随机推荐

  1. Java之MS SQL数据库连接

    一  1.首先,到微软官方下载jdbc驱动包 Microsoft JDBC Driver 4.0 for SQL Server 2.运行sqljdbc_4.0.2206.100_chs.exe,把文件 ...

  2. CentOS(二)--初识linux的一些常用命令

    linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器.内存.磁盘驱动器.键盘.鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命 ...

  3. [改善Java代码]使用forName动态加载类文件

    动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...

  4. VM虚拟机下centos7 无法上网的问题解决办法

    博主本着学无止境的精神在虚拟机上安装了一个centos7 来敲敲命令行.刚开始就遇到了强大的阻力... ifconfig   vim  都没法用.这怎么行,安装呗.又学了圈安装,yum命令. 结果yu ...

  5. gVim 配置方案 采用Vundle管理插件

    在Linux下配置vim非常简单,尤其是采用Vundle来管理插件,使得一切用起来得心应手. Maple大神在github上公布了自己的vim配置方案,相当方便好用.详见 https://github ...

  6. hdu 3938 Portal

    Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  7. 20个2014年最优秀的PHP框架

    http://www.php100.com/html/it/mobile/2014/0813/7198.htmlhttp://medoo.in/api/select 

  8. 关于mongodb ,redis,memcache

    先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然后就去研究了下redis. 一 ...

  9. 一步步搭建自己的轻量级MVCphp框架-(一)什么是PHP框架以及MVC设计模式

    PHP框架 php框架对很多新手而言可能会觉得很难攀越,其实不然 ,只要知道一个框架的流程,明白原理了,基本类似框架都可以看懂,php框架真正的发展要从php5开始了,其实php4时代就有一些框架,但 ...

  10. Ehcache(2.9.x) - API Developer Guide, Cache Manager Event Listeners

    About CacheManager Event Listeners CacheManager event listeners allow implementers to register callb ...