0

好吧,好吧。我正在制作一个哈希/去哈希网站,用于哈希 MD5、SHA1、SHA512 等。在制作时,我决定做这个表结构:

hash_id int(11)
plain_text varchar(100)
hash_md5 varchar(32)    
hash_base64 varchar(500)
hash_sha1 varchar(50)   
hash_sha512 varchar(128)
hash_mysql varchar(50)

Dehash()我的课堂上创建函数时,我发现我不能只使用 OR OR OR OR OR “搜索”字符串而不会遇到性能问题,所以我问,是否有某种 MySQL 函数可以提供帮助我这样做没有性能问题?

另外,有了这个,另一个问题可能是我必须获取哈希所在的列名,例如:

如果我要使用 OR OR OR OR OR,我的查询将是:

$Query = $this->DB->prepare("SELECT plain_text, hash_md5, hash_base64, hash_sha1, hash_sha512, hash_mysql FROM hashes WHERE hash_md5 = ? OR hash_base64 = ? OR hash_sha1 = ? OR hash_sha512 = ? OR hash_mysql = ?");
$Query->bind_param("sssss", $Hash, $Hash, $Hash, $Hash, $Hash);
$Query->execute();
$Query->bind_result($pt,  $md5, $b64, $sha1, $sha512, $mysql);
$Query->fetch();
$Query->close();

但是你没看到这可能会造成多大的问题吗?当我这样做时,我还必须执行一个 if 语句来检查列是否包含哈希,如果是,那就是带有哈希的列,但是其他列会占用内存,使我的网站变慢。

4

1 回答 1

0

假设您在所有 hash_something 字段上都有索引,这应该很快

SELECT plain_text, 'md5' as hash_type,
FROM hashes WHERE hash_md5 = ?
UNION 
SELECT plain_text, 'sha1' as hash_type,
FROM hashes WHERE hash_sha1 = ?
UNION 
SELECT plain_text, 'sha512' as hash_type,
FROM hashes WHERE hash_sha512 = ?
UNION 
...

如果您使用 OR-s 选择它,mysql 有时会将其优化为等效的东西,但不能保证

更好的方法是有一张像

CREATE TABLE `hashes` (
    `plaintext` VARCHAR(255) NOT NULL,
    `hash_type` VARCHAR(10) NOT NULL,
    `hash_value` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`plaintext`, `hash_type`),
    INDEX `hash_value` (`hash_value`)
);
于 2012-07-22T01:00:43.277 回答