zoukankan      html  css  js  c++  java
  • 拉链法解决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'));
    ?>
  • 相关阅读:
    vc 定义返回值为字符串函数方法
    typedef用法(二)
    新版.Net开发必备十大工具【转自www.bitsCN.com】
    大公司面试题
    NET(C#)连接各类数据库集锦
    对对象类型和调用方法属性进行存储以提升反射性能
    数据库连接字符串大全
    C#操作注册表的方法
    上班族解除疲劳
    在Microsoft Visual Studio 2005上安装.net3.0开发环境(含开发环境下
  • 原文地址:https://www.cnblogs.com/shibazi/p/3819999.html
Copyright © 2011-2022 走看看