PHP中用hash實(shí)現(xiàn)的數(shù)組
更新時(shí)間:2011年07月17日 12:50:25 作者:
今天回顧學(xué)習(xí)了PHP中變量實(shí)現(xiàn)的方法,在瀏覽其源碼是發(fā)現(xiàn)在PHP中所有的數(shù)據(jù)類型通過(guò)一個(gè)union存儲(chǔ)。php語(yǔ)言是弱類型語(yǔ)言,其實(shí)現(xiàn)中通過(guò)記錄變量的類型和值來(lái)實(shí)現(xiàn)其管理。
PHP中使用最多的非Array莫屬了,那Array是如何實(shí)現(xiàn)的?在PHP內(nèi)部Array通過(guò)一個(gè)hashtable來(lái)實(shí)現(xiàn),其中使用鏈接法解決hash沖突的問(wèn)題,這樣最壞情況下,查找Array元素的復(fù)雜度為O(N),最好則為1.
而其計(jì)算字符串hash值的方法如下,將源碼摘出來(lái)以供查備:
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:對(duì)于以下函數(shù),仍有兩點(diǎn)不明:
hash = 5381設(shè)置的理由?
這種step=8的循環(huán)方式是為了效率么?
而其計(jì)算字符串hash值的方法如下,將源碼摘出來(lái)以供查備:
復(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:對(duì)于以下函數(shù),仍有兩點(diǎn)不明:
hash = 5381設(shè)置的理由?
這種step=8的循環(huán)方式是為了效率么?
您可能感興趣的文章:
- PHP Hash算法:Times33算法代碼實(shí)例
- PHP中對(duì)各種加密算法、Hash算法的速度測(cè)試對(duì)比代碼
- php的hash算法介紹
- php 分庫(kù)分表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)證哈希最簡(jiǎn)單的方法詳解
- PHP實(shí)現(xiàn)的各類hash算法長(zhǎng)度及性能測(cè)試實(shí)例
相關(guān)文章
PHP編程求最大公約數(shù)與最小公倍數(shù)的方法示例
這篇文章主要介紹了PHP編程求最大公約數(shù)與最小公倍數(shù)的方法,涉及php數(shù)學(xué)計(jì)算的相關(guān)運(yùn)算技巧,需要的朋友可以參考下2017-05-05php cookie名使用點(diǎn)號(hào)(句號(hào))會(huì)被轉(zhuǎn)換
php cookie名不能使用點(diǎn)號(hào)(句號(hào)),應(yīng)該說(shuō)可以使用點(diǎn)號(hào)的cookie名,但會(huì)被轉(zhuǎn)換,要知道為什么,祥看本文2014-10-10功能強(qiáng)大的PHP POST提交數(shù)據(jù)類
這篇文章主要為大家詳細(xì)介紹了功能強(qiáng)大的PHP POST提交數(shù)據(jù)類,代碼簡(jiǎn)潔且具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07php 數(shù)組隨機(jī)取值的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇php 數(shù)組隨機(jī)取值的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05PHP 網(wǎng)頁(yè)過(guò)期時(shí)間的控制代碼
有時(shí)我們需要控制主頁(yè)之類的網(wǎng)頁(yè)過(guò)期時(shí)間。但我們比如使用的是Chinacache的CDN,那要怎么樣設(shè)計(jì)才能讓他緩存我的內(nèi)容.2009-06-06