PHP中用hash實(shí)現(xiàn)的數(shù)組
更新時間:2011年07月17日 12:50:25 作者:
今天回顧學(xué)習(xí)了PHP中變量實(shí)現(xiàn)的方法,在瀏覽其源碼是發(fā)現(xiàn)在PHP中所有的數(shù)據(jù)類型通過一個union存儲。php語言是弱類型語言,其實(shí)現(xiàn)中通過記錄變量的類型和值來實(shí)現(xiàn)其管理。
PHP中使用最多的非Array莫屬了,那Array是如何實(shí)現(xiàn)的?在PHP內(nèi)部Array通過一個hashtable來實(shí)現(xiàn),其中使用鏈接法解決hash沖突的問題,這樣最壞情況下,查找Array元素的復(fù)雜度為O(N),最好則為1.
而其計(jì)算字符串hash值的方法如下,將源碼摘出來以供查備:
static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)
{
register ulong hash = 5381; //此處初始值的設(shè)置有什么玄機(jī)么?
/* variant with the hash unrolled eight times */
for (; nKeyLength >= 8; nKeyLength -= 8) { //這種step=8的方式是為何?
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++; //比直接*33要快
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
}
switch (nKeyLength) {
case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ //此處是將剩余的字符hash
case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 1: hash = ((hash << 5) + hash) + *arKey++; break;
case 0: break;
EMPTY_SWITCH_DEFAULT_CASE()
}
return hash;//返回hash值
}
ps:對于以下函數(shù),仍有兩點(diǎn)不明:
hash = 5381設(shè)置的理由?
這種step=8的循環(huán)方式是為了效率么?
而其計(jì)算字符串hash值的方法如下,將源碼摘出來以供查備:
復(fù)制代碼 代碼如下:
static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)
{
register ulong hash = 5381; //此處初始值的設(shè)置有什么玄機(jī)么?
/* variant with the hash unrolled eight times */
for (; nKeyLength >= 8; nKeyLength -= 8) { //這種step=8的方式是為何?
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++; //比直接*33要快
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
hash = ((hash << 5) + hash) + *arKey++;
}
switch (nKeyLength) {
case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ //此處是將剩余的字符hash
case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
case 1: hash = ((hash << 5) + hash) + *arKey++; break;
case 0: break;
EMPTY_SWITCH_DEFAULT_CASE()
}
return hash;//返回hash值
}
ps:對于以下函數(shù),仍有兩點(diǎn)不明:
hash = 5381設(shè)置的理由?
這種step=8的循環(huán)方式是為了效率么?
您可能感興趣的文章:
- PHP Hash算法:Times33算法代碼實(shí)例
- PHP中對各種加密算法、Hash算法的速度測試對比代碼
- php的hash算法介紹
- php 分庫分表hash算法
- PHP的password_hash()使用實(shí)例
- 理解php Hash函數(shù),增強(qiáng)密碼安全
- PHP隨機(jī)生成唯一HASH值自定義函數(shù)
- 一致性哈希算法以及其PHP實(shí)現(xiàn)詳細(xì)解析
- php-perl哈希算法實(shí)現(xiàn)(times33哈希算法)
- PHP 5.5 創(chuàng)建和驗(yàn)證哈希最簡單的方法詳解
- PHP實(shí)現(xiàn)的各類hash算法長度及性能測試實(shí)例
相關(guān)文章
PHP編程求最大公約數(shù)與最小公倍數(shù)的方法示例
這篇文章主要介紹了PHP編程求最大公約數(shù)與最小公倍數(shù)的方法,涉及php數(shù)學(xué)計(jì)算的相關(guān)運(yùn)算技巧,需要的朋友可以參考下2017-05-05php cookie名使用點(diǎn)號(句號)會被轉(zhuǎn)換
php cookie名不能使用點(diǎn)號(句號),應(yīng)該說可以使用點(diǎn)號的cookie名,但會被轉(zhuǎn)換,要知道為什么,祥看本文2014-10-10功能強(qiáng)大的PHP POST提交數(shù)據(jù)類
這篇文章主要為大家詳細(xì)介紹了功能強(qiáng)大的PHP POST提交數(shù)據(jù)類,代碼簡潔且具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07