質問

  

可能な重複:
  ハッシュコードを生成する方法c#のバイト配列から

C#では、ストレージ内で一意であることを確認するために、イメージのハッシュを作成する必要があります。

これをバイト配列に簡単に変換できますが、そこからどのように進めるかわかりません。

.NETフレームワークに私を支援できるクラスはありますか、またはそのような一意のハッシュを作成するための効率的なアルゴリズムを知っている人はいますか?

役に立ちましたか?

解決

.NETには、暗号化ハッシュを作成するハッシュサムプロバイダーが多数あります。これにより、一意であるという条件が満たされます(ほとんどの場合、衝突防止)。これらはすべて非常に高速であり、1兆回以上実行しない限り、ハッシュはアプリのボトルネックにはなりません。

個人的にはSHA1が好きです:

string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

ある方法は別の方法より遅いかもしれないと人々が言う場合でも、それはすべて相対的な用語です。画像を扱うプログラムは、ハッシュサムを生成するマイクロ秒プロセスに間違いなく気付かないでしょう。

また、衝突に関しては、ほとんどの目的でこれは無関係です。 「廃止」であってもMD5のようなメソッドは、ほとんどの状況で非常に便利です。システムのセキュリティが衝突の防止に依存している場合にのみ使用しないことをお勧めします。

他のヒント

SHA1を使用してハッシュを生成することに関する Rex Mの回答の部分は良い部分です(MD5も人気がありますオプション)。常に新しい暗号プロバイダーを作成しないというzvolkovの提案も良いものです(速度が仮想的に保証された一意性よりも重要な場合、CRCを使用する提案も同様です。

ただし、 Encoding.UTF8は使用しないでください .GetString()を使用してbyte []を文字列に変換します(もちろん、コンテキストから有効なUTF8であることがわかっている場合を除きます)。たとえば、無効なサロゲートを拒否します。 byte []から常に有効な文字列を提供することが保証されているメソッドは、 Convertです。 ToBase64String()

ハッシュを計算する必要があるたびにSHA1CryptoServiceProviderの新しいインスタンスを作成することは、まったく高速ではありません。同じインスタンスを使用するのは非常に高速です。

それでも、暗号化用に設計されたハッシュ関数は、GetHash( )オーバーライド(それがあなたの望むものだと仮定)。

C#でCRCを計算する例については、次のリンクを参照してください。 http:// sanity-free .org / 134 / standard_crc_16_in_csharp.html

PSハッシュを小さく(16または32ビット)する理由は、それらを高速に比較できるようにするためです(ハッシュを持つことの全体的なポイントでした、覚えていますか?)。ハッシュを文字列としてエンコードされた256ビットの長い値で表すことは、パフォーマンスの点で非常に正気です。

標準のハッシュアルゴリズムはどれでも使用できますが、ハッシュは技術的に一意性を保証できません。ハッシュは、比較的高速かつ/または小さなトークンとして設計されており、1つのデータが他のデータと同じかどうかを確認できます。まったく異なるデータセットが同じハッシュを生成することは完全に可能ですが、これらをアルゴリズム的に生成することは非常に困難です。

それ以外は、可能性のある身元を確認するために、MD5はかなり高速です。 SHAはより信頼性が高い(MD5はハッキングされているため、セキュリティに使用すべきではありません)が、速度も遅くなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top