Hash链表

<?php

/*
  +------------------------------------------------------------------------------
  | datetime 2013-10-29  12:46:44
  +------------------------------------------------------------------------------
  | author baijm
  +------------------------------------------------------------------------------
 */

/**
 * hash节点的数据结构,用类模拟一个数据链表
 */
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);
        $this->buckets = array();
    }

    /**
     * 计算key的hash值,使用最简单的hash算法
     * @param type $key
     * @return type
     */
    private function hashFunc($key) {
        for ($i = 0, $len = strlen($key); $i < $len; $i++) {
            $hashVal+=ord($key{$i});
        }
        return $hashVal % $this->size;
    }

    public function insert($key, $value) {
        $index = $this->hashFunc($key);
        if (isset($this->buckets[$index])) {
            $nextNode = new HashNode($key, $value, $this->buckets[$index]);
        } else {
            $nextNode = new HashNode($key, $value);
        }
        $this->buckets[$index] = $nextNode;
    }

    public function find($key) {
        $index = $this->hashFunc($key);
        $current = $this->buckets[$index];
        while(isset($current)){
            if($current->key==$key){
                break;
            }else{
                $current=$current->nextNode;
            }
        }
        print_r($this->buckets);
        return $current->value;
    }

}

$hash = new HashTable();
$hash->insert('key1', 'value1');
$hash->insert('key12', 'value12');
$hash->find('key1');
$hash->find('key12');
?>

 

转载于:https://www.cnblogs.com/bai-jimmy/p/3394123.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值