热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用PHP实现的HashTable及说明

最近在看凹凸曼和白菜写的书,500多页,其实我真正想看的是PHP扩展部分以及缓存部分。下面是凹凸曼用PHP实现的HashTable代码,其中需要说明的有两点

最近在看凹凸曼和白菜写的书,500多页,其实我真正想看的是PHP扩展部分以及缓存部分。下面是凹凸曼用PHP实现的HashTable代码,其中需要说明的有两点:
1)代码中使用了 SplFixedArray ,这是一个更接近C语言的数组[Array],而且效率更高。使用之前需要开启SPL扩展,PHP5.3+默认开启。
2)代码中使用拉链法解决冲突,即将所有相同的Hash值的关键字节点链接在同一个链表中。

  1. php
  2. class HashNode {
  3. public $key;
  4. public $value;
  5. public $nextNode;
  6.  
  7. public function __construct($key, $value, $nextNode = NULL) {
  8. $this->key = $key;
  9. $this->value = $value;
  10. $this->nextNode = $nextNode;
  11. }
  12. }
  13. //天涯PHP博客 http://blog.phpha.com
  14. class HashTable {
  15. private $buckets;
  16. private $size = 10;
  17.  
  18. public function __construct() {
  19. $this->buckets = new SplFixedArray($this->size);
  20. }
  21.  
  22. private function hashfunc($key) {
  23. $strlen = strlen($key);
  24. $hashval = 0;
  25. for ($i = 0; $i < $strlen; $i++) {
  26. $hashval += ord($key{$i});
  27. }
  28. return $hashval % $this->size;
  29. }
  30.  
  31. public function insert($key, $value) {
  32. $index = $this->hashfunc($key);
  33. /* 新创建一个节点 */
  34. if (isset($this->buckets[$index])) {
  35. $newNode = new HashNode($key, $value, $this->buckets[$index]);
  36. } else {
  37. $newNode = new HashNode($key, $value, NULL);
  38. }
  39. $this->buckets[$index] = $newNode; /* 保存新节点 */
  40. }
  41.  
  42. public function find($key) {
  43. $index = $this->hashfunc($key);
  44. $current = $this->buckets[$index];
  45. while (isset($current)) { /* 遍历当前链表 */
  46. if ($current->key == $key) { /* 比较当前节点的关键字 */
  47. return $current->value; /* 查找成功 */
  48. }
  49. $current = $current->nextNode; /* 比较下一个节点 */
  50. }
  51. return NULL; /* 查找失败 */
  52. }
  53. }
  54. //天涯PHP博客 http://blog.phpha.com
  55. //******* 下面是测试代码 *******
  56. $ht = new HashTable();
  57. $ht->insert('key1', 'value1');
  58. $ht->insert('key12', 'value12');
  59. echo $ht->find('key1');
  60. echo $ht->find('key12');
  61. ?>

推荐阅读
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
  • Python入门:第一天准备与安装
    本文详细介绍了Python编程语言的基础知识和安装步骤,帮助初学者快速上手。涵盖Python的特点、应用场景以及Windows环境下Python和PyCharm的安装方法。 ... [详细]
  • 本文探讨了高质量C/C++编程的最佳实践,并详细分析了常见的内存错误及其解决方案。通过深入理解内存管理和故障排除技巧,开发者可以编写更健壮的程序。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
  • C语言标准及其GCC编译器版本
    编程语言的发展离不开持续的维护和更新。本文将探讨C语言的标准演变以及GCC编译器如何支持这些标准,确保其与时俱进,满足现代开发需求。 ... [详细]
  • 解析SQL查询结果的排序问题及其解决方案
    本文探讨了为什么某些SQL查询返回的数据集未能按预期顺序排列,并提供了详细的解决方案,帮助开发者理解并解决这一常见问题。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
  • Python 学习是否需要先掌握 C 语言?
    Python 是一门非常适合编程入门的语言,很多人疑惑是否需要先学习 C 语言才能更好地掌握 Python。本文将详细探讨这个问题,并为初学者提供专业的建议。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的 ... [详细]
author-avatar
Dear丶尐英
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有