我在 GitHub 上搜索 Bloom Filters 时遇到了这个简单的 PHP 类,它被命名为“Bloom Filter”,但我认为它更像是一个“哈希表”,无论哪种方式我都很好奇,它很容易理解。
它读入一个单词文件并为每个单词创建一个哈希数组键,然后您可以检查该单词是否存在于哈希数组中。
我很好奇,尽管使用它与仅将实际单词存储为数组键或值然后检查该单词是否存在于数组中相比有什么好处,理论上这只会增加开销并做同样的事情,请帮助我明白我错过了什么吗?
<?php
class Dictionary {
private $words;
private $wordsHash;
public $hashLength;
public function __construct($filepath, $hashLength) {
$this->words = file($filepath);
$this->hashLength = $hashLength;
foreach($this->words as $word){
$this->wordsHash[$this->createHash($word)] = true;
}
echo 'words: ' . count($this->words) . ' hashes: ' . count($this->wordsHash) . "\n";
}
public function createHash($str){
$hash = substr(md5(trim($str)), 0, $this->hashLength);
return $hash;
}
public function checkDictionary($str){
$hash = $this->createHash(trim($str));
if(array_key_exists ($hash , $this->wordsHash)){
return true;
}
return false;
}
}
?>
dictionary.txt 文件有 10,000 个单词,我将仅显示一些用于演示
der
die
und
in
den
von
zu
das
mit
sich
des
auf
für
ist
示例用法:
<?php
$dictionary = new Dictionary('dictionary.txt', 30);
if($dictionary->checkDictionary('den')){
echo 'The Word den Exist in the Hash Table';
}else{
echo 'The Word den DOES NOT Exist in the Hash Table';
}
?>