哈希表在php中的使用

美女程序员鼓励师

本文操作系统:windows7系统、PHP5.6版本、DELL G3电脑。

1.内部组成

(key):用于操作数据的标示,例如PHP数组中的索引,或者字符串键等等。

(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。

哈希函数(hash function):将key映射(map)到数据应该存放的slot所在位置的函数。

2.优势

通过关键值计算直接获取目标位置,对于海量数据中的精确查找有非常惊人的速度提升,理论上即使有的数据量,一个实现良好的哈希表依旧可以保持O(1)的查找速度,而O(n)的普通列表此时已经无法正常执行查找操作(实际上不可能,受到JVM可用内存限制,机器内存限制等)。

3.应用场景

在工程上,经常用于通过名称指定配置信息、通过关键字传递参数、建立对象与对象的映射关系等。目前最流行的NoSql数据库之一Redis,整体的使用了哈希表思想。

一言以蔽之,所有使用了键值对的地方,都运用到了哈希表思想。

4.使用实例

<?php

 

class hashTable

{

    private $collection;

    private $size = 100;

 

    //初始化哈希表的大小

    public function __construct($size='')

    {

        $bucketsSize = is_int($size)?$size:$this->size;

        $this->collection = new SplFixedArray($bucketsSize);

    }

 

    //生成散列值,作为存储数据的位置

    private function _hashAlgorithm($key)

    {

        $length = strlen($key);

        $hashValue = 0;

        for($i=0; $i<$length; $i++) {

            $hashValue += ord($key[$i]);

        }

        return ($hashValue%($this->size));

    }

 

    //在相应的位置存储对应的值

    public function set($key, $val)

    {

        $index = $this->_hashAlgorithm($key);

        $this->collection[$index] = $val;

    }

 

    //根据键生成散列值,进而找到对应的值

    public function get($key)

    {

        $index = $this->_hashAlgorithm($key);

        return $this->collection[$index];

    }

 

    //删除某个值,成功返回1,失败返回0

    public function del($key)

    {

        $index = $this->_hashAlgorithm($key);

        if(isset($this->collection[$index])) {

            unset($this->collection[$index]);

            return 1;

        } else {

            return 0;

        }

    }

 

    //判断某个值是否存在,存在返回1, 不存在返回0

    public function exist($key)

    {

        $index = $this->_hashAlgorithm($key);

        if($this->collection[$index]){

            return 1;

        } else {

            return 0;

        }

    }

 

    //返回key的个数

    public function size()

    {

        $size = 0;

        $length = count($this->collection);

        for($i=0; $i<$length; $i++) {

            if($this->collection[$i]) {

                $size++;

            }

        }

        return $size;

    }

 

    //返回value的序列

    public function val()

    {

        $size = 0;

        $length = count($this->collection);

        for($i=0; $i<$length; $i++) {

            if($this->collection[$i]) {

                echo $this->collection[$i]."<br />";

            }

        }

    }

 

    //排序输出

    public function sort($type=1)

    {

        $length = count($this->collection);

        $temp = array();

        for($i=0; $i<$length; $i++) {

            if($this->collection[$i]) {

                $temp[] = $this->collection[$i];

            }

        }

 

        switch ($type) {

            case 1:

                //正常比较

                sort($temp, SORT_REGULAR);

                break;

            case 2:

                //按照数字比较

                sort($temp, SORT_NUMERIC);

                break;

            //按照字符串进行比较

            case 3:

                sort($temp, SORT_STRING);

                break;

            //根据本地字符编码环境进行比较

            case 4:

                sort($temp, SORT_LOCALE_STRING);

                break;

 

        }

        echo "<pre>";

        print_r($temp);

    }

 

    //逆序输出

    public function rev($type=1)

    {

        $length = count($this->collection);

        $temp = array();

        for($i=0; $i<$length; $i++) {

            if($this->collection[$i]) {

                $temp[] = $this->collection[$i];

            }

        }

 

        switch ($type) {

            case 1:

                //正常比较

                rsort($temp, SORT_REGULAR);

                break;

            case 2:

                //按照数字比较

                rsort($temp, SORT_NUMERIC);

                break;

            //按照字符串进行比较

            case 3:

                rsort($temp, SORT_STRING);

                break;

            //根据本地字符编码环境进行比较

            case 4:

                rsort($temp, SORT_LOCALE_STRING);

                break;

 

        }

        echo "<pre>";

        print_r($temp);

    }

 

 

}

 

//简单的测试

$list = new hashTable(200);

$list->set("zero", "zero compare");

$list->set("one", "first test");

$list->set("two", "second test");

$list->set("three", "three test");

$list->set("four", "fouth test");

echo $list->val();

echo "after sorted : <br />";

$list->rev(3);

以上就是哈希表在php中的使用,大家可以看到在实例代码部分还是很复杂的,所以大家一定要对哈希表的基本组成和概念理解透彻后,才能进行下一步的使用更多php学习指路:php数组

以上是 哈希表在php中的使用 的全部内容, 来源链接: utcz.com/z/542850.html

回到顶部