电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

PHP內(nèi)核探索 —— PHP哈希算法設(shè)計(jì)

瀏覽:5日期:2022-09-16 14:16:29

HashTable是PHP的核心,這話一點(diǎn)都不過(guò)分。PHP的數(shù)組、關(guān)聯(lián)數(shù)組、對(duì)象屬性、函數(shù)表、符號(hào)表等等都是用HashTable來(lái)做為容器的。

PHP的HashTable采用的拉鏈法來(lái)解決沖突,這個(gè)自不用多說(shuō),我今天主要關(guān)注的就是PHP的Hash算法,和這個(gè)算法本身透露出來(lái)的一些思想。

PHP的Hash采用的是目前最為普遍的DJBX33A (Daniel J. Bernstein, Times 33 with Addition),這個(gè)算法被廣泛運(yùn)用與多個(gè)軟件項(xiàng)目,Apache、Perl和Berkeley DB等。對(duì)于字符串而言這是目前所知道的最好的哈希算法,原因在于該算法的速度非常快,而且分類非常好(沖突小,分布均勻)。

算法的核心思想就是:

hash(i) = hash(i-1) * 33 + str[i]

在zend_hash.h中,我們可以找到在PHP中的這個(gè)算法:

static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength){ register ulong hash = 5381; /* variant with the hash unrolled eight times */for (; nKeyLength >= 8; nKeyLength -= 8) {hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++;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... */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;}

相比在Apache和Perl中直接采用的經(jīng)典Times 33算法:

hashing function used in Perl 5.005:# Return the hashed value of a string: $hash = perlhash('key')# (Defined by the PERL_HASH macro in hv.h)sub perlhash{ $hash = 0; foreach (split //, shift) {$hash = $hash*33 + ord($_); } return $hash;}

在PHP的hash算法中,我們可以看出很處細(xì)致的不同。首先,最不一樣的就是,PHP中并沒(méi)有使用直接乘33,而是采用了:

hash << 5 + hash

這樣當(dāng)然會(huì)比用乘快了。

然后,特別要主意的就是使用的unrolled,我前幾天看過(guò)一篇文章講Discuz的緩存機(jī)制,其中就有一條說(shuō)是Discuz會(huì)根據(jù)帖子的熱度不同采用不同的緩存策略,根據(jù)用戶習(xí)慣,而只緩存帖子的第一頁(yè)(因?yàn)楹苌儆腥藭?huì)翻帖子)。

于此類似的思想,PHP鼓勵(lì)8位一下的字符索引,他以8為單位使用unrolled來(lái)提高效率,這不得不說(shuō)也是個(gè)很細(xì)節(jié)的,很細(xì)致的地方。

另外還有inline,register變量 … 可以看出PHP的開(kāi)發(fā)者在hash的優(yōu)化上也是煞費(fèi)苦心。

最后就是,hash的初始值設(shè)置成了5381,相比在Apache中的times算法和Perl中的Hash算法(都采用初始hash為0),為什么選5381呢?具體的原因我也不知道,但是我發(fā)現(xiàn)了5381的一些特性:

Magic Constant 5381: 1. odd number 2. prime number 3. deficient number 4. 001/010/100/000/101 b

看了這些,我有理由相信這個(gè)初始值的選定能提供更好的分類。

至于說(shuō),為什么是Times 33而不是Times 其他數(shù)字,在PHP Hash算法的注釋中也有一些說(shuō)明,希望對(duì)有興趣的同學(xué)有用:

DJBX33A (Daniel J. Bernstein, Times 33 with Addition)This is Daniel J. Bernstein’s popular `times 33’ hash function asposted by him years ago on comp.lang.c. It basically uses a functionlike ``hash(i) = hash(i-1) * 33 + str[i]’’. This is one of the bestknown hash functions for strings. Because it is both computed veryfast and distributes very well.The magic of number 33, i.e. why it works better than many otherconstants, prime or not, has never been adequately explained byanyone. So I try an explanation: if one experimentally tests allmultipliers between 1 and 256 (as RSE did now) one detects that evennumbers are not useable at all. The remaining 128 odd numbers(except for the number 1) work more or less all equally well. Theyall distribute in an acceptable way and this way fill a hash tablewith an average percent of approx. 86%.If one compares the Chi^2 values of the variants, the number 33 noteven has the best value. But the number 33 and a few other equallygood numbers like 17, 31, 63, 127 and 129 have nevertheless a greatadvantage to the remaining numbers in the large set of possiblemultipliers: their multiply operation can be replaced by a fasteroperation based on just one shift plus either a single additionor subtraction operation. And because a hash function has to bothdistribute good _and_ has to be very fast to compute, those fewnumbers should be preferred and seems to be the reason why Daniel J.Bernstein also preferred it. -- Ralf S. Engelschall <rse@engelschall.com>

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 哈尔滨发电机,黑龙江柴油发电机组-北方星光 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 电磁流量计_智能防腐防爆管道式计量表-金湖凯铭仪表有限公司 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 粘度计,数显粘度计,指针旋转粘度计 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 卫生型双针压力表-高温防腐差压表-安徽康泰电气有限公司 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 广州企亚 - 数码直喷、白墨印花、源头厂家、透气无手感方案服务商! | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 安规电容|薄膜电容|陶瓷电容|智旭JEC安规电容厂家 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 样品瓶(色谱样品瓶)百科-浙江哈迈科技有限公司 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 北京办公室装修,办公室设计,写字楼装修-北京金视觉装饰工程公司 北京成考网-北京成人高考网 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 贵州自考_贵州自学考试网 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 西门子代理商_西门子变频器总代理-翰粤百科 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 震动筛选机|震动分筛机|筛粉机|振筛机|振荡筛-振动筛分设备专业生产厂家高服机械 |