PHP ve MySQL hashtable uygulanmasında Adımlar

4 Cevap php

Ben programlama diline yeni ve PHP ve mysql kullanıyorum. Ben php bir hashtables yapmak için bir atama var. Ne yapmam gerekiyor, bir kullanıcı toplanmış ve daha sonra görüntülemek mağaza ürün olduğunu. Ben yanlışım varsa hashtable uygulamak zaman sonra internet üzerinden biraz araştırma yapmak, ben aşağıdaki adımları yapacak, beni düzeltin lütfen:

  1. Tabloları ayarlayın:

    -> Kullanıcılar Tablo: uid (int [5]), kullanıcı adı (varchar [128]), item_id (int [8], items_id_hash (int [50])

    -> Öğeler Tablo: item_id (int [5]), ITEM_NAME (varchar [128]), items_id_hash (int [50])

  2. Bir hash fonksiyonu (kendim oluşturma veya internetten almak? Bir karma işlevi oluşturmak için nasıl) bir hash değeri bir anahtar dönüştürmek ve daha sonra veritabanına eklemek için oluşturun. Örn:. Hash item_id = 001 hash değeri içine = (örn.) 12345 Sonra da kullanıcıların tabloya eklemek.

  3. / Arama görüntülemek için. Kullanıcı hash değerlerini almak ve sonra öğeleri masaya karşılaştırmak ve görüntülemek.

Sorular:

  1. Benim adım doğru mu?
  2. Nerede bir iyi php karma işlevi bulabilirim? I MD5 veya SHA1 veya tuz kullanabilir miyim?

4 Cevap

Ben bir Hashtable senin fikrin biraz [geçersiz] olduğunu düşünüyorum. Hashtables benziyoruz listeleri içine tuşları yıkmak. Örneğin: Hashtable adının ilk harfi temelinde, yani 26 listeleri olurdu. Sizin hash sonra arama için daha hızlı kılan adının ilk harfi vardır.

MD5, SHA1 veri tahrif olmamıştır doğrulamak için kullanılan sağlamalarının türetmek için kullanılır. genellikle 128-bit veya 160-bit sürümlerinde ya gelir. Bu yüzden X verileri alır ve ne olursa olsun bu yapılır nerede aynı olmalıdır 128-bit alfanümerik dize ile gelip bir karma aracılığıyla gönderir. Bu genellikle bir güvenlik şeydir.

EDIT: tuşları türetmek için nasıl Soru genişletilmesi.

Sen satır için kullanmak için bir anahtar oluşturmak için veri modülüne yararlanabilirler. X Eğer istiyorum anahtarların toplam sayısı örnek veri% X. Bu ile sorun X bulmak zor olmasıdır; Eğer 20 öğeler, varsa o zaman 20 içine X yapmak mümkündür ve her madde kendi satır var olduğu gibi bir hızlı arama yapar. Ama sonra% 1.000 yaparken 1000 öğeleri varsa mümkün değildir. X = 75 gibi bir şey yapıyor, bu daha iyi çalışacak.

Siz iki ana sorun var:

Kapalı) karma tablo | 1) hashtable paradigma (açık seçmek istiyorum.

2) Hashtable anahtar dizinleri ile basit bir dizi ve çarpışmalar durumlar için bir dizi referans olabilir.

/ Yeterli olabilir), ancak md5 seçebilirsiniz; $ hash - 3) Sen karma anahtar üretim algoritması ($ hash = ord ($ string [$ i]) + ($ hash << 5) çalışma var çok sha. Eğer anahtar alanı biliyorsanız, belki unix gperf kullanabilirsiniz.

İşte benim karma tablo uygulamasıdır:

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

?>

Eğer bir karma değer (bir tabloda depolamak olan), yerine bir karma tablo demek?

Ben karma bir tabloda, yararlı bir şekilde bu verileri depolamak nasıl görmüyorum. (Suroots cevap hash tabloları açıklar).

MD5 denemek kullanarak bir karma değeri oluşturmak için

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

http://au.php.net/function.hash daha fazla bilgi için bkz:

roa3

Bu kod herhangi bir kalıcı datastore arkaplana kullanarak değil, mysql desteği eklemek için basit uzatabilirsiniz.

Bir ilişkisel veritabanı bir one_to_many ilişki (kepçe, girdileri) kullanarak bu uygulamak zorunda.

Bu temel sınıfı genişletmek nasıl düşünün.

İyi şanslar