下面是用PHP实现的HashTable代码,其中需要说明的有两点:

1、代码中使用了 SplFixedArray ,这是一个更接近C语言的数组[Array],而且效率更高。使用之前需要开启SPL扩展,PHP5.3+默认开启。

2、代码中使用拉链法解决冲突,即将所有相同的Hash值的关键字节点链接在同一个链表中。

<?php
/**
 * Memcached常规应用演示
 * 天涯PHP博客
 * http://blog.phpha.com
 */
class HashNode {
    public $key;
    public $value;
    public $nextNode;

    public function __construct($key, $value, $nextNode = NULL) {
        $this->key = $key;
        $this->value = $value;
        $this->nextNode = $nextNode;
    }
}

class HashTable {
    private $buckets;
    private $size = 10;

    public function __construct() {
        $this->buckets = new SplFixedArray($this->size);
    }

    private function hashfunc($key) {
        $strlen = strlen($key);
        $hashval = 0;
        for ($i = 0; $i < $strlen; $i++) {
            $hashval += ord($key{$i});
        }
        return $hashval % $this->size;
    }

    public function insert($key, $value) {
        $index = $this->hashfunc($key);
        /* 新创建一个节点 */
        if (isset($this->buckets[$index])) {
            $newNode = new HashNode($key, $value, $this->buckets[$index]);
        } else {
            $newNode = new HashNode($key, $value, NULL);
        }
        $this->buckets[$index] = $newNode; /* 保存新节点 */
    }

    public function find($key) {
        $index = $this->hashfunc($key);
        $current = $this->buckets[$index];
        while (isset($current)) { /* 遍历当前链表 */
            if ($current->key == $key) { /* 比较当前节点的关键字 */
                return $current->value; /* 查找成功 */
            }
            $current = $current->nextNode; /* 比较下一个节点 */
        }
        return NULL; /* 查找失败 */
    }
}

// 测试代码
$ht = new HashTable();
$ht->insert('key1', 'value1');
$ht->insert('key12', 'value12');
echo $ht->find('key1');
echo $ht->find('key12');
?>

标签:PHP