HashBytes関数で適切なアルゴリズムを選択する


20

比較のために、nvarcharデータのハッシュ値を作成する必要があります。T-SQLには複数のハッシュアルゴリズムがありますが、このシナリオで選択するのに最適なものはどれですか?

2つの異なるnvarchar値のハッシュ値が重複するリスクが最小になるようにします。インターネットでの私の研究に基づいて、MD5が最高のようです。そうですか?MSDNは、利用可能なアルゴリズムについて(下記のリンク)を教えてくれますが、どの条件のどのアルゴリズムに関する説明はありませんか?

HASHBYTES(Transact-SQL)

2つのテーブルを2つのnvarchar(max)列で結合する必要があります。ご想像のとおり、クエリの実行には時間がかかります。各nvarchar(max)データのハッシュ値を保持し、ブロブであるnvarchar(max)値ではなく、ハッシュ値で結合を行う方が良いと考えました。問題は、どのハッシュアルゴリズムが一意性を提供するかです。そのため、1つ以上のnvarchar(max)に対して1つのハッシュ値を持つリスクに直面することはありません。

回答:


18

このHASHBYTES関数は、入力として最大8000バイトしか使用しません。入力は潜在的にそれより大きいため、選択されたアルゴリズムに関係なく、ハッシュされるフィールドの範囲内の重複は衝突引き起こします。慎重にあなたがハッシュに予定したデータの範囲を検討する-最初の4000個の文字を使用することで明白な選択、しかしではないかもしれない最良のあなたのデータのための選択。

いずれにせよ、ハッシュ関数とは何か、入力が8000バイト以下であっても、結果の100%の正確さを保証する唯一の方法は、ある時点でベース値を比較することです(必ず読んでください:必ずしも最初ではありません)。期間。

企業は、100%の精度が必要かどうかを決定します。これにより、(a)ベース値の比較が必要であるか、(b)ベース値を比較しないことを検討 する必要があること、つまり、パフォーマンスとトレードオフの精度を判断する必要があります。

一意の入力セットではハッシュの衝突が発生する可能性がありますが、選択されたアルゴリズムに関係なく、非常にまれです。このシナリオでハッシュ値を使用するという考え方は、結合結果をより管理しやすいセットに効率的に絞り込むことであり、必ずしもすぐに最終的な結果セットに到達することではありません。繰り返しになりますが、100%の正確さのために、これはプロセスの最終ステップにはなりませんこのシナリオでは暗号化の目的でハッシュを使用していないため、MD5などのアルゴリズムは正常に機能します。

「精度」の目的でSHA-xアルゴリズムに移行することを正当化するのは非常に難しいでしょう。なぜなら、ビジネスがMD5のごくわずかな衝突の可能性について気が狂うなら、チャンスも彼らが気が狂うからです。 SHA-xアルゴリズムも完全ではありません。彼らは、わずかに不正確な条件を満たしているか、クエリが100%正確であり、関連する技術的な意味合いを満たしていることを義務付ける必要があります。もしあなたがMD5の代わりにSHA-xを使用したことを知っていて、CEOが夜よく眠れたら、それでいいと思う。この場合、技術的な観点からはあまり意味がありません。

パフォーマンスについて言えば、テーブルがほとんど読み取りであり、結合結果が頻繁に必要な場合は、インデックスビューを実装して、要求されるたびに結合全体を計算する必要をなくすことを検討してください。もちろん、それと引き換えにストレージを使用しますが、特に100%の精度が必要な場合は、パフォーマンスを改善するために十分な価値があるかもしれません。

長い文字列値のインデックスの詳細については、単一のテーブルに対してこれを行う方法の例を紹介し、この質問のシナリオ全体を試みる際に考慮すべき事項を示す記事公開しました


8

MD5は正常で、出力はバイナリ(16)で保存できます。衝突の確率(誕生日のパラドックスを参照)は、物理サンプルサイズが大きい場合でも、依然として非常に低くなっています。SHA-1の出力には20バイト、SHA-256の出力には32バイトが必要です。誕生日の衝突の確率がかなり高くなる(物理的に不可能であるか、または現在のハードウェアテクノロジーでは少なくとも非実用的である)レコードが非常に多い場合を除き、おそらく大丈夫です。


4

私はSHA-1を使用します。これは利用可能なアルゴリズムの中でより優れたものであり、すべてのアルゴリズムの中で衝突予測が最小です(MD5の2 ^ 20.96と比較して2 ^ 51)。MD5は、特定のシナリオでの衝突に対して脆弱であることが証明されています。

ソース:

http://en.wikipedia.org/wiki/SHA-1 http://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions#Cryptanalysis http://en.wikipedia.org/wiki/MD5


0

私は答えで言及されたこれを見ていませんが、MSDNごとに:

SQL Server 2016(13.x)以降、SHA2_256およびSHA2_512以外のすべてのアルゴリズムは非推奨になりました。古いアルゴリズム(非推奨)は動作し続けますが、非推奨イベントが発生します。

私は尋ねた同様の質問をあなたは(あなたは2016+にしている場合)、MD5のような非推奨の機能を使用する場合、それはあなた次第ですので。テストを実行して、MD5とSHA2のストレージとパフォーマンスの違いを確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.