程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 拉鏈法解決Hash節點沖突相關問題

拉鏈法解決Hash節點沖突相關問題

編輯:關於PHP編程

<?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'));
?>

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved