0

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

然而,问题在于搜索。我对这种大规模的数据库没有经验。所以,我在 MySQL 等中使用“WHERE”语句进行了一些随机测试。猜猜看,在 SQL 完成搜索并找到 HASH 并给我 WORD 作为回报之前,我花了 14 多分钟才找到匹配项。

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

4

1 回答 1

-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 保存在缓存中,并对这些值进行一些二进制搜索。如果没有这样的键,数据库引擎必须遍历每个值来检查它,而一次检查将每次需要检查的数量减少一半。但是,这种解释可能有点不正确,但是如果我错了,其他人可能会进一步解释/纠正我。做这么简单的事情应该会给你带来很大的进步。

于 2013-03-18T07:17:59.863 回答