在PHP和Mysql中实现哈希表的步骤

时间:2009-02-12 02:56:15

标签: php mysql hashtable

我是编程语言的新手,我使用的是PHP和mysql。我得到了一个在PHP中做哈希表的任务。我需要做的是,存储用户收集的项目然后显示它。在通过互联网进行一些研究后,我将在实施哈希表时执行以下步骤,如果我错了请纠正我:

  1. 设置表格:

    - >用户表:uid(int [5]),用户名(varchar [128]),item_id(int [8],items_id_hash(int [50])

    - >项目表:item_id(int [5]),item_name(varchar [128]),items_id_hash(int [50])

  2. 创建一个哈希函数(如何创建哈希函数?自己创建或从互联网上获取?)将密钥转换为哈希值,然后插入数据库。例如:hash item_id = 001到哈希值=(例如)12345。然后插入到用户表中。

  3. 显示/搜索。从用户检索哈希值,然后将其与items表进行比较并显示它。

  4. 问题:

    1. 我的步骤是否正确?
    2. 我在哪里可以找到一个好的PHP哈希函数?我可以使用md5或sha1或盐吗?

4 个答案:

答案 0 :(得分:4)

我认为你对哈希表的看法有点[废弃]。 Hashtables将密钥分解为相似的列表。例如:基于名字的第一个字母的哈希表,因此将有26个列表。您的哈希是名称的第一个字母,然后可以更快地搜索。

md5,sha1用于派生用于验证数据是否未被篡改的哈希值。它们通常有128位或160位版本。因此,它需要X数据并通过散列发送它以得到一个128位的字母数字字符串,无论它在哪里都应该是相同的。这通常是安全的事情。

编辑:扩展了如何派生密钥的问题。

您可以利用数据模数来创建用于行的键。在示例数据%X中,其中X是您希望拥有的键的总数。这个问题是X很难找到;如果您有20个项目,那么将X设置为20是可行的,并且可以快速搜索,因为每个项目都有自己的行。但如果您有1000个项目,则执行%1000是不可行的。做X = 75这样的事情会更好。

答案 1 :(得分:2)

您有两个主要问题:

1)您想要选择(打开|关闭)哈希表的哈希表范例。

2)Hashtable可以是一个带有键索引的简单数组和一个用于碰撞情况的数组引用。

3)你必须研究你的哈希密钥生成算法($ hash = ord($ string [$ i])+($ hash<< 5) - $ hash;就足够了),但是你可以选择md5 / sha也是。如果您知道密钥空间,也许可以使用unix gperf。

这是我的哈希表实现:

<?php

/**
        A brief but simple closed hash table class.
        Jorge Niedbalski R. <jnr@niedbalski.org>
**/

class   HashTable       {

        public  $HashTable = array();
        public  $HashTableSize;

        public  function __construct($tablesize) 
        {
                if($tablesize) {
                        $this->HashTableSize = $tablesize;
                } else {
                        print "Unknown file size\n";
                        return -1;
                }
        }

        public  function __destruct() 
        {
                unset($this->HashTable);
        }

        public  function  generate_bucket($string) 
        {
                for($i=0; $i <= strlen($string); $i++) {
                        $hash = ord($string[$i]) + ($hash << 5) - $hash;
                }
                print "".$this->HashTableSize."\n";
                return($hash%$this->HashTableSize);
        }
    public  function  add($string, $associated_array)
        {
                  $bucket = $this->generate_bucket($string);

                  $tmp_array = array();
                  $tmp_array['string'] = $string;
                  $tmp_array['assoc_array'] = $associated_array;                

                  if(!isset($this->HashTable[$bucket])) {
                                $this->HashTable[$bucket] = $tmp_array;
                  } else {
                        if(is_array($this->HashTable[$bucket])) {
                                array_push($this->HashTable[$bucket], $tmp_array);
                        } else {
                                $tmp = $this->HashTable[$bucket];
                                $this->HashTable[$bucket] = array();
                                array_push($this->HashTable[$bucket], $tmp);
                                array_push($this->HashTable[$bucket], $tmp_array);
                        }
                }

        }

        public  function  delete($string, $attrname, $attrvalue) 
        {       
                $bucket = $this->generate_bucket($string);

                if(is_null($this->HashTable[$bucket])) {
                                return -1;
                } else {
                        if(is_array($this->HashTable[$bucket])) {
                                for($x = 0; $x <= sizeof($this->HashTable[$bucket]); $x++) {
                                        if(($this->HashTable[$bucket][$x]['string'] == $string) && ($this->HashTable[$bucket][$x]['.$attrname.'] == $attrvalue)) {
                                                unset($this->HashTable[$bucket][$x]);   
                                        }
                                }
    } else {
                                unset($this->HashTable[$bucket][$x]);
                        }
                }       
                /** everything is OK **/                        
                return 0;
        }


        public  function  search($string) 
        {
                $resultArray = array();

                $bucket = $this->generate_bucket($string);

                if(is_null($this->HashTable[$bucket])) {
                        return -1;
                } else {
                        if(is_array($this->HashTable[$bucket])) {
                                for($x = 0; $x <= sizeof($this->HashTable[$bucket]); $x++) {
                                        if(strcmp($this->HashTable[$bucket][$x]['string'], $string) == 0) {
                                                array_push($resultArray,$this->HashTable[$bucket][$x]);
                                        }
                                 }
                        } else {
                                array_push($resultArray,$this->HashTable[$bucket]);
                        }
                }

                return($resultArray);
        }
}

        $hash = new HashTable(16);

        $arr = array('nombre' => "jorge niedbalski");

        $hash->add("astroza", $arr);
        $hash->add("astrozas", $arr);

        print_r($hash->search("astroza"));

?>

答案 2 :(得分:1)

你的意思是一个哈希值(你存储在一个表中),而不是一个哈希表?

我不知道如何在哈希表中以有用的方式存储数据。 (Suroots回答解释哈希表)。

要使用MD5创建哈希值,请尝试

hash('md5','string to hash');

有关详细信息,请参阅http://au.php.net/function.hash

答案 3 :(得分:1)

<强> roa3

该代码不使用任何持久数据存储后端,您可以简单地扩展它以添加mysql支持。

您必须使用关系数据库中的one_to_many关系(存储桶,条目)来实现此目的。

考虑如何扩展这个基类。

祝你好运