3

私たちのアプリでは、png 画像と ~200 文字のバイト配列が渡されます。200文字のファイル名が必要ないため、そのバイト配列に対応するファイル名で画像を保存しますが、バイト配列自体は保存しません。だから、私が考えたのは、bytearrayをデータベースに保存してから、MD5で短いファイル名を取得することでした。特定の画像を表示するときが来たら、そのバイト配列、MD5 を調べてから、そのファイルを探します。

ここまでは順調ですね。問題は、2 つの異なる bytearray が同じ MD5 にハッシュされる可能性があることです。次に、あるファイルが別のファイルを効果的に上書きします。それとも彼らはできますか?私の質問は

  • 2 つの ~200 文字のバイト配列 MD5 ハッシュを同じ文字列にすることはできますか?
  • もし可能なら、それは宇宙の 10 年代に 1 回のような取引ですか、それとも私のアプリで起こりうることですか?
  • 一意であることが保証されている (たとえば) 32 文字の文字列を生成するハッシュ アルゴリズムはありますか?
4

8 に答える 8

8

32 バイトよりも 200 バイトの方が多くの情報を格納できるため、200 バイトのソースから 32 バイトのコードを取得することは論理的に不可能です。

唯一の例外は、これらの 200 バイトに格納された情報が 32 バイトにも収まることです。その場合、ソースの日付形式は非常に非効率的でスペースを浪費します。

于 2012-05-29T11:54:29.700 に答える
6

(暗号化とは対照的に) ハッシュする場合、ハッシュされるデータの情報空間を縮小するため、常に衝突の可能性があります。

ハッシュ関数で期待できる最善のことは、すべてのハッシュがハッシュ空間に均等に分散され、ハッシュ出力が「宇宙の10年に1回の種類の取引」を提供するのに十分な大きさであることです。あなたはそれを置く!

したがって、ハッシュが「十分」であるかどうかは、衝突の結果に依存します。チェックサム/ハッシュに常に一意のIDを追加して、両方の長所を活かすことができます.

于 2012-05-29T11:58:37.480 に答える
4

データベースから一意の IDを使用しないのはなぜですか?

于 2012-05-29T11:56:12.373 に答える
4

2 つのハッシュが衝突する可能性は、ハッシュ サイズによって異なります。MD5 は 128 ビットのハッシュを生成します。したがって、ハッシュ数が2 128 +1の場合、少なくとも 1 つの衝突が発生します。

この数は、SHA1では2 160 + 1、 SHA512では 2 512 +1です。

ここでは、このルールが適用されます。出力ビットが多いほど、一意性と計算量が増えます。したがって、トレードオフがあります。あなたがしなければならないことは、最適なものを選択することです。

于 2012-05-29T11:56:59.343 に答える
3

2 つの ~200 文字のバイト配列を MD5 ハッシュして同じ文字列にすることはできますか?

32 バイトの文字列 (MD5 ダイジェスト) よりも 200 バイトの文字列の方が多いことを考えると、それは確実です。

すべてのハッシュ関数にはその問題がありますが、MD5 よりも堅牢なものもあります。SHA-1 を試してください。git は同じ目的で使用しています。

于 2012-05-29T11:55:52.343 に答える
2

他の人が前に言ったように。ハッシュは、衝突のリスクに問題がない限り、必要なものを提供しません。

ここでデータベースが役に立ちます。200 の長い文字列ごとに一意のインデックスを取得します。ここでは衝突はありません。200 個の長い名前をインデックスに登録する必要があります。これにより、余分なメモリが使用されますが、検索が非常に高速になるように並べ替えられます。ファイル名に簡単に使用できる一意の ID を取得します。

于 2013-01-10T09:40:37.020 に答える
2

2 つの MD5 ハッシュが衝突する (同じである) 場合があります。1996 年、 MD5 アルゴリズムに欠陥が発見され、暗号解読者は SHA-1 ハッシュ アルゴリズムに切り替えるようアドバイスしました。

そのため、SHA-1 (40 文字) に切り替えることをお勧めします。でも心配はいりません。あなたの 2 つの写真が同じハッシュになるとは思えません。アプリケーションでこのリスクを想定できると思います。

于 2012-05-29T11:53:44.390 に答える
0

私はハッシュアルゴリズムにあまり取り組んでいませんが、私の理解によれば、ハッシュアルゴリズムには常に衝突の可能性があります。つまり、2つの異なるオブジェクトが同じハッシュ値にハッシュされる可能性がありますが、オブジェクトが同じハッシュにハッシュされるたびに保証されます価値。線形プロービングなど、これに使用できる他の手法があります。

于 2012-05-29T12:06:03.217 に答える