PHP中Array的hash函数实现
时间:2011-05-11
来源:互联网
PHP中Array的hash函数实现
今天回顾学习了PHP中变量实现的方法,在浏览其源码是发现在PHP中所有的数据类型通过一个union存储。
php语言是弱类型语言,其实现中通过记录变量的类型和值来实现其管理。
PHP中使用最多的非Array莫属了,那Array是如何实现的?
在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
ps:对于以下函数,仍有两点不明:
1. hash = 5381设置的理由?
2. 这种step=8的循环方式是为了效率么?
Php代码
- 1.static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)
- 2.{
- 3. register ulong hash = 5381; //此处初始值的设置有什么玄机么?
- 4.
- 5. /* variant with the hash unrolled eight times */
- 6. for (; nKeyLength >= 8; nKeyLength -= 8) { //这种step=8的方式是为何?
- 7. hash = ((hash << 5) + hash) + *arKey++;
- 8. hash = ((hash << 5) + hash) + *arKey++;
- 9. hash = ((hash << 5) + hash) + *arKey++;
- 10. hash = ((hash << 5) + hash) + *arKey++; //比直接*33要快
- 11. hash = ((hash << 5) + hash) + *arKey++;
- 12. hash = ((hash << 5) + hash) + *arKey++;
- 13. hash = ((hash << 5) + hash) + *arKey++;
- 14. hash = ((hash << 5) + hash) + *arKey++;
- 15. }
- 16. switch (nKeyLength) {
- 17. case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ //此处是将剩余的字符hash
- 18. case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
- 19. case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
- 20. case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
- 21. case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
- 22. case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
- 23. case 1: hash = ((hash << 5) + hash) + *arKey++; break;
- 24. case 0: break;
- 25.EMPTY_SWITCH_DEFAULT_CASE()
- 26. }
- 27. return hash; //返回hash值
- 28.}
作者: so_brave 发布时间: 2011-05-11
谢谢楼主分享 学习了
作者: ailiu008 发布时间: 2011-05-11
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28