1

数値 (約 22 桁) をハッシュする必要があり、結果の長さは 12 文字未満にする必要があります。数字または文字の組み合わせで、一意である必要があります。(入力された番号も一意になります)。

たとえば、入力した数値が 000000000000000000001 の場合、結果は 2s5As5A62s のようになります。

MD5 や SHA-1 などの典型的なものを調べましたが、結果の長さが長くなります。

4

4 に答える 4

6

あなたの質問の問題は、入力が出力よりも大きく、一意であることです。一意の出力も期待している場合、それは起こりません。この背後にある理由は、たとえば 22 桁の数字 (10^22 の可能性) の入力スペースと、11 桁 (16^11 の可能性) の長さの 16 進数の出力スペースがある場合、出力の可能性。

以下のグラフは、19 桁の 16 進数の出力スペースと完全な 1 対 1 の関数が必要であることを示しています。そうしないと、かなり頻繁に (50% 以上の確率で) 衝突が発生します。これはあなたが望んでいないものだと思いますが、指定していません。

ここに画像の説明を入力

あなたが望むことはできないので、設計を再考するか、巡回冗長検査(CRC) などのチェックサムを使用することをお勧めします。CRC-64 は 64 ビット出力を生成し、任意のbase64アルゴリズムでエンコードすると、必要な線に沿って何かが得られます。これは SHA-1 のような暗号強度を提供しないため、情報セキュリティに関連するものには使用しないでください。

ただし、長いハッシュ出力を許可するように基準を変更できた場合は、SHA-512を確認することを強くお勧めします。重複の可能性が非常に低く、高品質の出力が得られるからです。可能性は低いですが、アルゴリズムの歴史の中で、2 つの入力が同じハッシュに等しいことがまだ見つかっていないことを意味します。

これらの提案の両方がまだうまくいかない場合、最後の選択肢はおそらく入力データに base64 のみを使用することです。基本的に、データを表現するために可能な限り最善の方法で標準の英語のアルファベットを利用するため、入力データの完全な表現を保持しながら、可能な限り文字数を減らします。これはハッシュ関数ではなく、単にバイナリ データをエンコードする方法です。

于 2012-04-18T20:11:59.307 に答える
1

MD5 や SHA-N を使用してから BASE64 (または base-whatever) にリファクタリングし、そのうちの 12 文字のみを使用しないのはなぜですか? 注意: いずれの場合も、ハッシュは決して一意ではありません (ただし、衝突の可能性は低くなります)。

于 2012-04-18T19:30:36.237 に答える
1

一意である必要がある場合は、ハッシュを使用できません。

このような数値を格納するには、約 74 ビットが必要です。base-64に換算すると12文字くらいになります。

于 2012-04-18T19:32:39.533 に答える
0

ハッシュの要件について詳しく教えてください。結果が多様であることを確認する必要がありますか? (つまり、1 = a、2 = b ではない)

大声で少し横方向に考えただけですが、ランレングスエンコーディングの原則を数値に適用して、圧縮したいデータとして扱うことはできませんでした. その後、圧縮バージョンの base64 バージョンを使用できます。

于 2012-04-18T20:03:27.967 に答える