4

私はプログラミング言語に不慣れで、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. ハッシュ関数を作成して(ハッシュ関数を作成する方法?自分で作成するか、インターネットから取得するか?)、キーをハッシュ値に変換してからデータベースに挿入します。例:hash item_id = 001 into hash value =(eg)12345.次に、usersテーブルに挿入します。

  3. 表示/検索します。ユーザーからハッシュ値を取得し、それをアイテムテーブルと比較して表示します。

質問:

  1. 私の手順は正しいですか?
  2. 良いphpハッシュ関数はどこにありますか?md5またはsha1またはsaltを使用できますか?
4

4 に答える 4

4

ハッシュテーブルについてのあなたの考えは少し [機能していない] だと思います。ハッシュテーブルは、キーを類似したリストに分解します。例: 名前の最初の文字に基づくハッシュテーブルなので、26 個のリストがあります。ハッシュは名前の最初の文字であるため、検索が高速になります。

md5、sha1 は、データが改ざんされていないことを確認するために使用されるハッシュを導出するために使用されます。通常、128 ビット版または 160 ビット版のいずれかで提供されます。そのため、X データを取得し、ハッシュを介して送信して、どこで実行しても同じになる 128 ビットの英数字文字列を作成します。これは通常、セキュリティ上の問題です。

編集:キーを導出する方法の質問を展開します。

データのモジュラスを利用して、行に使用するキーを作成できます。サンプル データ % X では、X は必要なキーの総数です。これに関する問題は、X を見つけるのが難しいことです。20 個のアイテムがある場合、X を 20 にすることは実行可能であり、各アイテムには独自の行があるため、すばやく検索できます。しかし、1000 個のアイテムがある場合、% 1000 を実行することは現実的ではありません。X = 75 のようなことをすると、これがうまくいきます。

于 2009-02-12T03:05:43.103 に答える
2

2 つの主な問題があります。

1) 選択するハッシュテーブル パラダイム (open|closed) ハッシュ テーブル。

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

?>
于 2009-02-12T03:11:09.130 に答える
1

roa3

そのコードは永続的なデータストア バックエンドを使用していないため、簡単に拡張して mysql サポートを追加できます。

これは、リレーショナル データベースで one_to_many リレーション (バケット、エントリ) を使用して実装する必要があります。

この基本クラスを拡張する方法を考えてください。

幸運を

于 2009-02-12T04:23:47.940 に答える
1

ハッシュテーブルではなく、ハッシュ値 (テーブルに保存する) を意味しますか?

そのデータを便利な方法でハッシュ テーブルに保存する方法がわかりません。(Surootsの回答はハッシュテーブルについて説明しています)。

MD5 を使用してハッシュ値を作成するには

hash('md5', 'ハッシュする文字列');

詳細については、 http://au.php.net/function.hashを参照してください。

于 2009-02-12T03:14:24.910 に答える