【问题标题】:Steps in implementing hashtable in PHP and Mysql在 PHP 和 Mysql 中实现 hashtable 的步骤
【发布时间】:2010-10-07 02:11:09
【问题描述】:

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

  1. 设置表格:

    -> 用户表:uid(int[5]), username(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. 创建散列函数(如何创建散列函数?自己创建还是从互联网获取?)将键转换为散列值,然后插入数据库。 E.g.: hash item_id = 001 into hash value = (e.g) 12345. 然后插入到users表中。

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

问题:

  1. 我的步骤正确吗?
  2. 在哪里可以找到好的 php 哈希函数?我可以使用 md5 或 sha1 或 salt 吗?

【问题讨论】:

    标签: php mysql hashtable


    【解决方案1】:

    我认为您对哈希表的想法有点 [已失效]。哈希表将键分解为相似的列表。例如:基于名称第一个字母的哈希表,因此将有 26 个列表。您的哈希是名称的第一个字母,这样可以更快地搜索。

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

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

    您可以利用数据的模数来创建用于行的键。在示例数据 % X 中,X 是您想要拥有的键的总数。问题是 X 很难找到。如果您有 20 个项目,那么将 X 变为 20 是可行的,并且可以快速搜索,因为每个项目都有自己的行。但是如果你有 1000 个项目,那么做 % 1000 是不可行的。为此,执行 X = 75 之类的操作会更好。

    【讨论】:

    • 你的意思是我的哈希表数据应该是这样的:键:axxxx1 值:衬衫键:axxxx2 值:T 恤键:dxxxx1 值:时钟键:dxxxx2 值:手表
    • 假设您有 1000 个不同的项目,每个项目是长袖、T 恤、时钟或手表,您将为这些类型中的每一个创建一个列表(意味着类型是哈希表)。
    • 商品种类繁多,无法分类怎么办?有什么好的建议可以使键名相同吗?我处于各种物品的情况,很难分类。即使我分类了,每个类别也只有 1 到 5 个项目
    • 你可以做模数之类的事情;所以取数据 % X (其中 X 是您想要拥有的键的数量),这将成为用于该数据行的键。找到 X 的问题是你必须决定什么是好的数字。
    【解决方案2】:

    你有两个主要问题:

    1) 你要选择的哈希表范式(打开|关闭)哈希表。

    2) Hashtable 可以是一个简单的数组,其中包含键索引和冲突情况下的数组引用。

    3) 你必须研究你的哈希密钥生成算法($hash = ord($string[$i]) + ($hash

    这是我的哈希表实现:

    <?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"));
    
    ?>
    

    【讨论】:

    • 我的输出是:16 16 16 Array ( )
    【解决方案3】:

    您是指哈希值(存储在表中),而不是哈希表?

    我不明白如何以一种有用的方式将这些数据存储在哈希表中。 (Suroots 的回答解释了哈希表)。

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

    hash('md5', '要散列的字符串');

    查看http://au.php.net/function.hash了解更多详情

    【讨论】:

      【解决方案4】:

      roa3

      该代码没有使用任何持久数据存储后端,您可以简单地对其进行扩展以添加 mysql 支持。

      您必须在关系数据库中使用 one_to_many 关系(桶、条目)来实现这一点。

      想想如何扩展这个基类。

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 2018-03-29
        • 1970-01-01
        • 2017-07-22
        • 2022-01-16
        • 2021-06-20
        • 1970-01-01
        相关资源
        最近更新 更多