php核心技術與最佳實踐之hash演算法
hash表又稱雜湊表,通過把關鍵字key對映到陣列中的乙個位置來訪問記錄,以加快查詢速度。這個對映函式稱為hash函式,存放記錄的陣列稱為hash表。
1.
hash函式
作用是把任意長度的輸入,通過hash演算法變換成固定長度的輸出,該輸出就是hash值。這種轉換是一種壓縮對映,也就是hash值得空間通常遠小於輸入的空間,不輸入可能會雜湊成相同的輸出,而不可能從hash值來唯一的確定輸入值。
乙個好的hash函式應該滿足以下條件:每個關鍵字都可以均勻的分布到hash表任意乙個位置,並與其他已被雜湊到hash表中的關鍵字不發生衝突。這是hash函式最難實現的。
2.
hash演算法
1)
直接取餘法
直接取餘法比較簡單,直接用關鍵字k除以hash表的大小m取餘數,演算法如下:
h(k) = k mod m
例如:hash表的大小為m=12,所給關鍵字為k=100,則h(k) = 4.這種演算法是乙個求餘操作,速度比較快。
2)
乘積取整法
乘積取整法首先使用關鍵字k乘以乙個常數a(0h(k) = floor (m*(ka mod 1))
其中,ka mod1表示ka的小數部分,floor是取整操作。
當關鍵字是字串的時候,就不能用上面的hash演算法。因為字串是由字元組成,所以可以把字串所有的字元的ascii碼加起來得到乙個整數,然後再按照上面的hash演算法去計算即可。
演算法如下:
function hash($key,$m));
}return $hashval % $m;
}3)
經典hash
演算法times33
unsigned int djbhash(char *str)
return (hash &0x7fffffff)
}演算法思路就是不斷乘以33,其效率和隨機性都非常好,廣泛運用於多個開源專案中,如apache、perl和php等。
3.
hash表
hash表的時間複雜度為o(1),hash表結構可用圖表示:
要構造乙個hash表必須建立乙個足夠大的陣列用於存放資料,另外還需要乙個hash函式把關鍵字key對映到陣列的某個位置。
hash表的實現步驟:
1) 建立乙個固定大小的陣列用於存放資料。
2) 設計hash函式。
3) 通過hash函式把關鍵字對映到陣列的某個位置,並在此位置上進行資料訪問。
4.
使用php
實現hash表
首先建立乙個hashtable類,有兩個屬性$buckets和$size。$buckets用於儲存資料的陣列,$size用於記錄$buckets陣列大小。然後在建構函式中為$buckets陣列分配記憶體。**如下:
<?php
classhashtable
}?>
在建構函式中,為$buckets陣列分配了乙個大小為10的陣列。在這裡使用了spl擴充套件的splfixedarray陣列,不是一般的陣列(array)
這是因為splfixedarray陣列更接近於c語言的陣列,而且效率更高。在建立其陣列時需要為其提供乙個初始化的大小。
注意:要使用splfixedarray陣列必須開啟spl擴充套件。如果沒有開啟,可以使用一般的陣列代替。
接著為hash表指定乙個hash函式,為了簡單起見,這裡使用最簡單的hash演算法。也就是上面提到了把字串的所有字元加起來再取餘。**如下:
public function hashfunc($key));
}return $hashval % $this->size;
}有了hash函式,就可以實現插入和查詢方法。插入資料時,先通過hash函式計算關鍵字所在hash表的位置,然後把資料儲存到此位置即可。**如下:
public function insert($key,$val)
查詢資料方法與插入資料方法相似,先通過hash函式計算關鍵字所在hash表的位置,然後返回此位置的資料即可。**如下:
public function find($key)
至此,乙個簡單的hash表編寫完成,下面測試這個hash表。**清單如下:
<?php
$ht= new hashtable();
$ht->insert(『key1』,』value1』);
$ht->insert(『key2』,』value2』);
echo$ht ->find(『key1』);
echo$ht ->find(『key2』);
?>
完整**:#hash.php
<?php
class hashtable
publicfunction hashfunc($key));
}return$hashval % $this->size;
}publicfunction insert($key,$val)
publicfunction find($key)
}$ht = newhashtable();
$ht->insert('key1','value1');
$ht->insert('key2','value2');
echo $ht->find('key1');
echo $ht->find('key2');
?>
Spring2 0核心技術最佳實踐
1.定義 spring實現了aop功能的ioc容器 spring core spring的ioc容器管理的物件均是單例 2.簡單配置 啟動類 springstartup xmlbeanfactory factory new xmlbeanfactory new classpathresource b...
PHP核心技術
1.寫乙個能建立多級目錄的php函式 2.寫一段php 確保多個程序寫入檔案成功 3.寫乙個php函式,盡可能高效地從乙個標準的url裡取出檔案的副檔名,例如 http 需要取出php或者.php 方法一 方法二 4.寫乙個php函式,能夠遍歷乙個資料夾下的所有檔案和子資料夾 5.簡述論壇中無限分類...
PHP核心技術
1.寫乙個能建立多級目錄的php函式 2.寫一段php 確保多個程序寫入檔案成功 3.寫乙個php函式,盡可能高效地從乙個標準的url裡取出檔案的副檔名,例如 http 需要取出php或者.php 方法一 方法二 4.寫乙個php函式,能夠遍歷乙個資料夾下的所有檔案和子資料夾 5.簡述論壇中無限分類...