0

さて、まあ。MD5、SHA1、SHA512などをハッシュするためのハッシュ/デハッシュWebサイトを作成していました。作成中に、次のテーブル構造を作成することにしました。

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 ORを使用して文字列を「検索」できないことがわかったので、MySQL関数のようなものがありますか?私はパフォーマンスの問題を抱えることなくこれを行いますか?

また、これに伴い、次のように、ハッシュが含まれる列名を取得する必要があるという別の問題が発生する可能性があります。

OR 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を使用して選択した場合-smysqlはそれを同等のものに最適化することがありますが、保証されていません

より良い方法は、次のようなテーブルを持つことです

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 に答える