在数据库中查找HASH字符串(mysql和php)

时间:2013-03-18 07:15:52

标签: php mysql

所以,我有这个奇怪的想法,用词汇匹配哈希。但是,由于获得匹配的几率很小,我需要一个带有哈希和单词的大型数据库。我已经拥有一个庞大的数据库,其中包含数百万个随机/真实单词以及与该单词相对应的哈希值。

然而,问题是搜索。我没有这种大规模数据库的经验。所以,我在MySQL中使用“WHERE”statemens进行了一些随机测试。猜猜是什么,在SQL完成搜索并找到HASH并给我WORD作为回报之前,我花了超过14分钟找到一个匹配。 p>

我应该如何加快这个过程?我正在使用PHP和MySQL。是否需要在我的服务器上安装其他东西?或者是否已经内置到我可以使用的mysql中?

1 个答案:

答案 0 :(得分:-1)

添加一个自动递增的主键并将其命名为id。

我写了一个脚本,它接受/etc/dict中的所有单词并在它们上面运行md5,写出他们的名字和哈希来创建这样的东西:

"2af2fc92ed1ee8080d9ab015ab053074", "Windex's
"bfa818f0cac66108daef757706e97a99", "Windhoek
"88d0e322fb73a2e971bc982bd348c777", "Windows

我这样做的路线非常hacky所以我不会发布实现它的方式,但总的来说它很简单,基本上是基于:

while read line
    do
        echo $line | md5sum | awk '{print $1}'
    done

所以我创建了一个数据库表:

CREATE TABLE whashes
    (
     id int auto_increment primary key, 
     hash varchar(32), 
     word varchar(16)
    );

用过:

INSERT INTO whashes
(hash, word)
VALUES

上面的脚本输出。为速度进行测试。

SELECT * 
FROM  `whashes` 
WHERE word LIKE  "poop"
LIMIT 0 , 30

以0.0324秒的速度运行。这是100k字,应该保持这个速度

SELECT * 
FROM  `whashes` 
WHERE hash LIKE  "b538baf8573b52b5bcfdd551fffa6e9d"
LIMIT 0 , 30

以0.0202秒的速度运行。

根据我的理解,使用自动递增的主id整数键,计算机可以在缓存中保留大量的id,并对这些值进行一些二进制搜索。如果没有这样的密钥,数据库引擎必须循环检查每个值,与一次检查相比,每次检查减少了需要检查的量。但是,这种解释可能稍微不正确,但是如果我错了,其他人可能会进一步解释/纠正我。只做这样简单的事情应该会给你一个很大的改进。