<?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. 以前写过的一些oracle语句

    这下以后用起来就方便了.可算是找到了 Orcl 数据库服务 启动项: OracleDBConsoleorcl OracleOraDb10g_home1iSQL*Plus OracleOraDb10g_ ...

  2. oracle--clob

    最近,收到这样的异常邮件: Error updating database.  Cause: java.sql.SQLException: ORA-01461: can bind a LONG val ...

  3. [改善Java代码]不同的列表选择不同的遍历方法

    一.场景: 我们来看一个场景,统计一个省的各科高考科目考试的平均分. 当然使用数据库中的一个SQL语句就能求出平均值,不过这个不再我们的考虑之列,这里只考虑使用纯Java的方式来解决.(由于我的机器配 ...

  4. [改善Java代码] 谨慎包装类型的大小比较

    建议27:谨慎包装类型的大小比较 基本数据类型比较大小木有问题,不过其对应的包装类型大小比较就需要注意了.看如下代码: public class Client { public static void ...

  5. 把数据库中的字符串格式转为long类型

    背景: 在做接口时,需要把数据库中所有ID取出来,用jmter做一些数据关联,问题来了,数据库中的ID转换出来为字符型,而接口是需要使用LONG型,所以在导出来后,数据一直报类型不为long,那如何把 ...

  6. 转:传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确 .

    近期在做淘宝客的项目,大家都知道,淘宝的商品详细描述字符长度很大,所以就导致了今天出现了一个问题 VS的报错是这样子的  ” 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确“ 还说某 ...

  7. .NET 认识

  8. Linux 命令 - jobs: 显示后台作业的状态信息

    命令格式 jobs [-lnprs] [jobspec ...] jobs -x command [args] 命令参数 -l 额外显示作业的进程 ID. -n 只列出状态发生变化的进程. -p 只列 ...

  9. C#算法基础之递归排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. HDOJ2017字符串统计

    字符串统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...