好吧,好吧。我正在制作一个Hashing / Dehashing网站,用于散列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或没有遇到性能问题,所以我问,是否有某种MySQL函数可以帮助我做到这一点而不会出现性能问题?
另外,有了这个,另一个问题可能是我必须得到散列所在的列名,例如:
如果我要使用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语句来检查列是否包含哈希值,如果是,那就是带有哈希值的列,但是其他列占用内存,使得我的站点慢。
答案 0 :(得分: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`)
);