Home  >  Article  >  Backend Development  >  php implements Hash table function

php implements Hash table function

墨辰丷
墨辰丷Original
2018-05-30 11:22:011763browse

We have a little understanding of the Hash algorithm. Here is an example of using PHP to implement a Hash table. I hope these examples can help you. Friends in need can refer to

php Implementing the Hash table function

The Hash table is one of the most important data structures, also called a hash table. Use PHP to implement the function of Hash table. PHP can simulate addition, deletion, modification and query of Hash table. Accessed by mapping the key to a position in the array. The mapping function is called a Hash function, and the array storing records is called a Hash table.

The Hash function converts keys of any length and type into fixed-length output. Different keys may have the same hash.
The time complexity of the Hash table is O(1)

<?php
class HashTable{
  private $arr = array();
  private $size = 10;
  public function __construct(){
    //SplFixedArray创建的数组比一般的Array()效率更高,因为更接近C的数组。创建时需要指定尺寸
    $this->arr = new SplFixedArray($this->size);
  }
  /**
   * Description: 简单hash算法。输入key,输出hash后的整数
   * @param $key
   * @return int
   */
  private function simpleHash($key){
    $len = strlen($key);
    //key中每个字符所对应的ASCII的值
    $asciiTotal = 0;
    for($i=0; $i<$len; $i++){
      $asciiTotal += ord($key[$i]);
    }
    return $asciiTotal % $this->size;
  }
  /**
   * Description: 赋值
   * @param $key
   * @param $value
   * @return bool
   */
  public function set($key, $value){
    $hash = $this->simpleHash($key);
    $this->arr[$hash] = $value;
    return true;
  }
  /**
   * Description: 取值
   * @param $key
   * @return mixed
   */
  public function get($key){
    $hash = $this->simpleHash($key);
    return $this->arr[$hash];
  }
  public function getList(){
    return $this->arr;
  }
  public function editSize($size){
    $this->size = $size;
    $this->arr->setSize($size);
  }
}
?>

Let’s test our HashTable.

<?php
//测试1
$arr = new HashTable();
for($i=0; $i<15; $i++){
  $arr->set(&#39;key&#39;.$i, &#39;value&#39;.$i);
}
print_r($arr->getList());

//测试2
$arr->editSize(15);
for($i=0; $i<15; $i++){
  $arr->set(&#39;key&#39;.$i, &#39;value&#39;.$i);
}
print_r($arr->getList());
?>

After changing the value, more elements can be stored. However, there is still a problem that different keys may produce the same hash value, so when assigning a value, the subsequent operation will overwrite the previous operation. Let's use the zipper method to solve this conflict problem.

The zipper method resolves conflicts. The zipper method solves conflicts by putting all keys with the same hash value in a linked list. For example, key3 and key14 are both 0 after hashing. Then store these two values ​​​​where the key of the array is 0, in the form of a linked list. . If you don't understand my text, please look at the example below and you will understand after looking at the printed information. What is the zipper method? It is a linked list.

Create a HashNode class to store the values ​​of key and value, and store another element of the same hash. On the same chain, searching for later elements takes more time. The time complexity is O(n).

<?php
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 NewHashTable{
  private $arr;
  private $size = 10;
  public function __construct(){
    $this->arr = new SplFixedArray($this->size);
  }
  private function simpleHash($key){
    $asciiTotal = 0;
    $len = strlen($key);
    for($i=0; $i<$len; $i++){
      $asciiTotal += ord($key[$i]);
    }
    return $asciiTotal % $this->size;
  }
  public function set($key, $value){
    $hash = $this->simpleHash($key);
    if(isset($this->arr[$hash])){
      $newNode = new HashNode($key, $value, $this->arr[$hash]);
    }else{
      $newNode = new HashNode($key, $value, null);
    }
    $this->arr[$hash] = $newNode;
    return true;
  }
  public function get($key){
    $hash = $this->simpleHash($key);
    $current = $this->arr[$hash];
    while(!empty($current)){
      if($current->key == $key){
        return $current->value;
      }
      $current = $current->nextNode;
    }
    return NULL;
  }
  public function getList(){
    return $this->arr;
  }
}
?>

Test our new HashTable

<?php
//测试1
$newArr = new NewHashTable();
for($i=0; $i<30; $i++){
  $newArr->set(&#39;key&#39;.$i, &#39;value&#39;.$i);
}
print_r($newArr->getList());
var_dump($newArr->get(&#39;key3&#39;));
?>

The above is the entire content of this article, I hope it will be helpful to everyone's study.


Related recommendations:

phpDetailed graphic explanation of codeigniter security precautions

php Detailed explanation of how to use session-cookie with codeigniter

php According to the auto-increment id Method to create a unique number class

The above is the detailed content of php implements Hash table function. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn