Шаги по реализации хеш-таблицы в PHP и Mysql - PullRequest
4 голосов
/ 12 февраля 2009

Я новичок в языке программирования, и я использую 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. Создать хеш-функцию (как создать хеш-функцию? Создать самостоятельно или получить из Интернета?), Чтобы преобразовать ключ в хеш-значение и затем вставить в базу данных. Например: хэш item_id = 001 в хэш-значение = (например, 12345). Затем вставьте в таблицу пользователей.

  3. Для отображения / поиска. Получите хэш-значения от пользователя, а затем сравните их с таблицей элементов и отобразите.

Вопросы:

  1. Правильны ли мои шаги?
  2. Где найти хорошую хэш-функцию php? Могу ли я использовать MD5 или Sha1 или соль?

Ответы [ 4 ]

4 голосов
/ 12 февраля 2009

Я думаю, что ваша идея хеш-таблицы немного [несуществующей]. Хеш-таблицы разбивают ключи на одинаковые списки. Например: хеш-таблица на основе первой буквы имени, поэтому будет 26 списков. Ваш хеш - это первая буква имени, что ускоряет поиск.

md5, sha1 используются для получения хэшей, которые используются для проверки того, что данные не были подделаны. они обычно бывают либо 128-битные, либо 160-битные версии. Таким образом, он принимает данные X и отправляет их через хеш, чтобы получить 128-битную буквенно-цифровую строку, которая должна быть одинаковой, независимо от того, где она выполняется. Обычно это вопрос безопасности.

РЕДАКТИРОВАТЬ: Расширение вопроса о том, как получить ключи.

Вы можете использовать модуль данных для создания ключа, который будет использоваться для строки. В примере данных% X, где X - общее количество ключей, которое вы хотели бы иметь. Проблема в том, что X трудно найти; если у вас есть 20 предметов, тогда возможно сделать X из 20, что делает его быстрым поиском, поскольку у каждого предмета есть свой ряд. Но если у вас есть 1000 предметов, то выполнение% 1000 НЕ возможно. Делать что-то вроде X = 75 будет лучше для этого.

2 голосов
/ 12 февраля 2009

У вас есть две основные проблемы:

1) Хеш-таблица, которую вы хотите выбрать (открыть | закрыть) хеш-таблицу.

2) Hashtable может быть простым массивом с ключевыми индексами и ссылкой на массив для случаев коллизий.

3) Вам нужно изучить алгоритм генерации хеш-ключа ($ hash = ord ($ string [$ i]) + ($ hash << 5) - $ hash; может быть достаточно), но вы можете выбрать md5 / Ша тоже. Если вы знаете свое ключевое пространство, возможно, вы можете использовать unix gperf. </p>

Вот моя реализация хеш-таблицы:

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

?>
1 голос
/ 12 февраля 2009

roa3

Этот код не использует какой-либо постоянной базы данных хранилища данных, вы можете просто расширить его, чтобы добавить поддержку MySQL.

Вы должны реализовать это, используя отношение one_to_many (сегмент, записи) в реляционной базе данных.

Подумайте, как расширить этот базовый класс.

Удачи

1 голос
/ 12 февраля 2009

Вы имеете в виду хеш-значение (которое вы храните в таблице), а не хеш-таблицу?

Я не вижу, как вы могли бы хранить эти данные полезным способом, в хеш-таблице. (Ответ Suroots объясняет хеш-таблицы).

Чтобы создать хеш-значение с помощью MD5, попробуйте

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

см. http://au.php.net/function.hash для получения более подробной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...