Шаги по реализации хэш-таблицы в PHP и Mysql

Я новичок в языке программирования, и я использую 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 в значение hash = (например) 12345. Затем вставьте в таблицу users.

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

Вопросов:

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

Related of "Шаги по реализации хэш-таблицы в PHP и Mysql"

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

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

EDIT: Расширение вопроса о том, как получить ключи.

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

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

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

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

3) Вы должны изучить алгоритм генерации ключа хеша ($ hash = ord ($ string [$ i]) + ($ hash << 5) – $ hash; может быть достаточно), но вы можете выбрать md5 / sha too , Если вы знаете свое ключевое пространство, возможно, вы можете использовать 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")); ?> 

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

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

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

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

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

roa3

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

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

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

Удачи