看书看到一个算法,觉得挺妙的。用拉链法解决哈希值冲突
<?php //建结点 class hashNope{ public $key; public $value; public $nextNope; public function __construct($key,$value,$nextNope=null){ $this->key=$key; $this->value=$value; $this->nextNope=$nextNope; } } //建一个哈希表 class hashTable{ private $buckets; private $size=10; public function __construct(){ $this->buckets=new SplFixedArray($this->size); //SplFixedArray()与array()作用一样,但效率更快 } //用了最简单的哈希算法,把关键字的所有字符串加起来再取余 private function hashfunc($key){ $len=strlen($key); $hashval=0; for($i=0;$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])){ $nope= new hashNope($key, $value,$this->buckets[$index]); } else { $nope= new hashNope($key, $value,null); } $this->buckets[$index]=$nope; } //查找算法 public function find($key){ $index=$this->hashfunc($key); $current=$this->buckets[$index]; while (isset($current)){ //遍历当前链表 if($current->key == $key){ return $current->value; } else $current =$current->nextNope; } return false; } } $ht= new hashTable(); $ht->insert('key1',' value1'); $ht->insert('key12', 'value2'); echo $ht->find('key1'); echo $ht->find('key12'); ?>