我是编程语言的新手,我使用的是PHP和mysql。我得到了一个在PHP中做哈希表的任务。我需要做的是,存储用户收集的项目然后显示它。在通过互联网进行一些研究后,我将在实施哈希表时执行以下步骤,如果我错了请纠正我:
设置表格:
- >用户表: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])
创建一个哈希函数(如何创建哈希函数?自己创建或从互联网上获取?)将密钥转换为哈希值,然后插入数据库。例如:hash item_id = 001到哈希值=(例如)12345。然后插入到用户表中。
显示/搜索。从用户检索哈希值,然后将其与items表进行比较并显示它。
问题:
答案 0 :(得分:4)
我认为你对哈希表的看法有点[废弃]。 Hashtables将密钥分解为相似的列表。例如:基于名字的第一个字母的哈希表,因此将有26个列表。您的哈希是名称的第一个字母,然后可以更快地搜索。
md5,sha1用于派生用于验证数据是否未被篡改的哈希值。它们通常有128位或160位版本。因此,它需要X数据并通过散列发送它以得到一个128位的字母数字字符串,无论它在哪里都应该是相同的。这通常是安全的事情。
编辑:扩展了如何派生密钥的问题。
您可以利用数据模数来创建用于行的键。在示例数据%X中,其中X是您希望拥有的键的总数。这个问题是X很难找到;如果您有20个项目,那么将X设置为20是可行的,并且可以快速搜索,因为每个项目都有自己的行。但如果您有1000个项目,则执行%1000是不可行的。做X = 75这样的事情会更好。
答案 1 :(得分:2)
您有两个主要问题:
1)您想要选择(打开|关闭)哈希表的哈希表范例。
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"));
?>
答案 2 :(得分:1)
你的意思是一个哈希值(你存储在一个表中),而不是一个哈希表?
我不知道如何在哈希表中以有用的方式存储数据。 (Suroots回答解释哈希表)。
要使用MD5创建哈希值,请尝试
hash('md5','string to hash');
有关详细信息,请参阅http://au.php.net/function.hash
答案 3 :(得分:1)
<强> roa3 强>
该代码不使用任何持久数据存储后端,您可以简单地扩展它以添加mysql支持。
您必须使用关系数据库中的one_to_many关系(存储桶,条目)来实现此目的。
考虑如何扩展这个基类。
祝你好运