標籤:style blog color 資料 2014 問題
<?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‘));?>