2012-04-18 14 views
0

数値(約22桁)をハッシュする必要があり、結果の長さは12文字未満でなければなりません。それは、数字または文字の組み合わせであり、一意でなければなりません。 (入力した数字もユニークになります)。制限された長さの結果を得るためのハッシュ関数

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

私はMD5、SHA-1などの典型的なものを見ましたが、それらは高い長さの結果を与えます。

+3

ハッシュは、定義上、一意ではありません。「1から10の間で8つのユニークな数字を与えると、1から5の間で8つのユニークなハッシュを与えます」と想像してみてください。それは厳密に不可能です。 – Servy

+0

Keerlには12文字のハッシュがあるので、4.7^21個のユニークなエントリを挿入できます。私は、すべての意図と目的のために、それはかなり合理的な期待だと言いたいと思います。 – eouw0o83hf

+1

ハッシュは、定義によれば、元のハッシュ値よりも可能性が低くなります。それがなければ、それをハッシュする理由はありません。 – Servy

答えて

0

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

0

ハッシュは一意でなければ使用できません。

このような番号を格納するには約74ビットが必要です。ベース64に変換すると、約12文字になります。

+1

すべての実用的な目的のために、どんなSHA-2アルゴリズムも、その入力空間のほとんどのためにユニークな出力を提供します。 SHA-2アルゴリズムが出力空間全体をカバーしないことは数学的には真ですが、どのアルゴリズムでも衝突は見つかっていません。 –

+0

実際には、22桁の10進数を格納するには76.4ビットが必要です。 log2(10E22-1)= 76.4 –

+0

@ MichaelJ.Gray:*ほとんど*ユニークであればOKです。それが完全にユニークでなければならない場合、十分ではありません。衝突が存在するので、それを見つけるのにどれくらい時間がかかります。 – Guffa

-1

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

ちょっと考えてみてください。数字にランレングス符号化の原則を適用せず、圧縮したいデータとして扱うことはできますか?その後、圧縮されたバージョンのbase64バージョンを使用できます。

+0

入力がランダムな場合、RLEはうまく動作しません。また、RLEの出力は時間の経過と共に変化し、長さはよりランダムではないが連続的な場合にはより多くの固有の入力で増加する。 –

6

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

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

enter image description here

は、あなたが行うことができない何をしたいので、私はあなたのデザインを再考するか、そのような cyclic redundancy check(CRC)としてチェックサムを使用してお勧めします。 CRC-64は64ビットの出力を生成し、任意の base64アルゴリズムでエンコードされたときに、あなたが望む線に沿って何かを与えるでしょう。これはSHA-1のような暗号強度を提供しないので、情報セキュリティに関連するものに決して使用すべきではありません。

しかし、長いハッシュ出力を許可するように条件を変更できる場合は、重複の可能性が非常に低い高品質の出力を提供するので、SHA-512を強くお勧めします。低い確率では、アルゴリズムの履歴で同じハッシュと等しくなる入力が2つありません。

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

+0

cool! '低い確率では、アルゴリズムの歴史の中で同じハッシュと等しくなる入力が2つありません –

関連する問題