2017-12-07 3 views
0

多くのSHA1データを格納し、結果を効率的に返すデータベースを構築するのに問題があります。多くのSHA1データを格納するためにデータベースを構築する方法

mysql> describe pwnd; 
+----------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| pwndpass | binary(20)  | NO |  | NULL |    | 
+----------+------------------+------+-----+---------+----------------+ 

mysql> select id, hex(pwndpass) from pwnd order by id desc limit 10; 
+-----------+------------------------------------------+ 
| id  | hex(pwndpass)       | 
+-----------+------------------------------------------+ 
| 306259512 | FFFFFFFEE791CBAC0F6305CAF0CEE06BBE131160 | 
| 306259511 | FFFFFFF8A0382AA9C8D9536EFBA77F261815334D | 
| 306259510 | FFFFFFF1A63ACC70BEA924C5DBABEE4B9B18C82D | 
| 306259509 | FFFFFFE3C3C05FCB0B211FD0C23404F75E397E8F | 
| 306259508 | FFFFFFD691D669D3364161E05538A6E81E80B7A3 | 
| 306259507 | FFFFFFCC6BD39537AB7398B59CEC917C66A496EB | 
| 306259506 | FFFFFFBFAD0B653BDAC698485C6D105F3C3682B2 | 
| 306259505 | FFFFFFBBFC923A29A3B4931B63684CAAE48EAC4F | 
| 306259504 | FFFFFFB58E389A0FB9A27D153798956187B1B786 | 
| 306259503 | FFFFFFB54953F45EA030FF13619B930C96A9C0E3 | 
+-----------+------------------------------------------+ 
10 rows in set (0.01 sec) 

私の質問は、関係:

これが私のデータである私は、SQLが私の最強のスキルではない認めるだろうが、練習として、私はかなり迅速に結果を返しますhttps://haveibeenpwned.com/Passwordsからデータ

を使用しようとしています現在6分以上かかるとすぐにエントリを見つけることができます。

mysql> select hex(pwndpass) from pwnd where hex(pwndpass) = '0000000A1D4B746FAA3FD526FF6D5BC8052FDB38'; 
+------------------------------------------+ 
| hex(pwndpass)       | 
+------------------------------------------+ 
| 0000000A1D4B746FAA3FD526FF6D5BC8052FDB38 | 
+------------------------------------------+ 
1 row in set (6 min 31.82 sec) 

正しいデータ型はありますか?私はsha1データの保存を検索し、バイナリ(20)フィールドは推奨されていますが、データを検索するために最適化する方法がわかりません。私のMySQLがインストール

私はVMに

+1

どのようにインデックスを作成するでしょうか? – Ronald

+0

正しい方向に私を向けることができますか? – doghousedean

+0

クイックグーグルと私は何か読んでいる。ありがとうございます – doghousedean

答えて

1

をより多くのディスクスペースを与える以外の任意の設定を調整していないVM https://www.turnkeylinux.org/mysqlきれいなターンキーである二つの最も明白なヒントがあります:

  • 列に索引を作成します。 。
  • すべての検索に16進数のすべての単一の行を変換しないでください:実際には

    select hex(pwndpass) 
    from pwnd 
    where hex(pwndpass) = '0000000A1D4B746FAA3FD526FF6D5BC8052FDB38'; 
    -- ^^^ This is forcing MySQL to convert every hash stored from binary to hexadecimal 
    --  so it can determine whether there's a match 
    

、あなたも、表示目的のために保存し、全く進必要はありません。

select id, hex(pwndpass) -- This is fine, will just convert matching rows 
from pwnd 
where pwndpass = ? 

... ?は、クライアント言語でバイナリ文字列に対応するプレースホルダです。あなたは、コマンドラインでのクエリの権利を実行する必要がある場合

は、あなたも使用することができhexadecimal literal

select id, hex(pwndpass) -- This is fine, will just convert matching rows 
from pwnd 
where pwndpass = 0x0000000A1D4B746FAA3FD526FF6D5BC8052FDB38 
+0

私はどのように私はSELECTステートメントをやっている必要がありますか?私は数日間それと一緒に遊んで、結果を得るために苦労しました – doghousedean

+0

優れた説明をありがとう、あなたのソリューションは完全に働いた – doghousedean

関連する問題