<?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. div 并排

    <style type="text/css">#d1 {float:left;background:#f00;}#d2 {float:left;background:# ...

  2. Scala中的数组

    数组 数组的两种声明方式,建议声明数组时指定类型. 访问数组元素时获取数组下标 数组Array类本身有很多非常方便的方法 变长数组ArrayBuffer,能够动态增加元素,也可以实现与Array的互转 ...

  3. HBase的JavaAPI操作

    如果是DDL的操作就找HbaseAdmin. 如果是表上的增删改查的操作就找HTable. 附录代码: mport java.util.Arrays; import org.apache.hadoop ...

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

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

  5. python学习day5--set、函数

    1.set 无序,不重复序列 创建:与dict一样用{},区别在于dict内元素为键值对 se={"123","456,444"} print(type(se) ...

  6. SignalR 2.0入门

    下载已完成的项目 本教程展示如何使用那么 SignalR 创建一个实时聊天应用程序.你会那么 SignalR 添加一个空的 ASP.NET web 应用程序,创建一个 HTML 页面发送并显示消息. ...

  7. python的全局变量玩法还挺特别的

    global g_arr def add(): #global g_arr g_arr = [] g_arr.append(1) add() print g_arr #你将收获一个NameError错 ...

  8. Android Timer用法

    Android考虑到线程安全问题,不允许在线程中执行UI线程,在Android中,有一个类:android.os.Handler,这个可以实现各处线程间的消息传递.先看段代码,这个实例化了一个Hand ...

  9. minicsv库的编译错误与解决方案

    有一个项目需要写csv文件以呈现数据.Github上有一个关于csv的轻量级读写库minicsv,于是下载之.但是编译example时出现了以下问题: In file included from ex ...

  10. 采用HttpModules来重写URLS

    首先写一个处理URLs重写的类,并且这个类必须继承IHttpHandler接口,以博客园的程序为例: public class UrlReWriteModule : System.Web.IHttpM ...