長さ 60 ~ 100 文字の可変長文字列を 16 文字の一意の文字列に変換する必要があります。入力も一意になることに注意してください。使用できる既存のハッシュアルゴリズムはありますか? または、これを達成できる別の方法はありますか?
2 に答える
0
ハッシュ関数は、ピジョンホールの原理により一意の出力を持ちません。実際に 2^16 未満の個別の入力がある場合は可能ですが、これは私が知っているハッシュ関数の設計目標ではなく、すべての入力の知識を使用してハッシュ関数を作成する必要があります。したがって、それをエミュレートする必要があります。合理的で効率的な最も単純なスキームは次のようです。
- 入力文字列から整数までの連想配列を保持する
- 文字列をハッシュするときは、連想配列で検索します
- 連想配列にある場合は、関連付けられた値を返します
- それ以外の場合は、
map[input] = map.entry_count()
それを返してください
これにより、すべての入力に一意の整数が割り当てられ、O(1) 予想時間または O(log n) 時間でハッシュが行われますが、ある程度のスペースが必要です。次に、必要に応じて、この整数を文字列に変換できます。たとえば、base64 エンコーディング、16 進表記を使用するか、何らかの文字エンコーディングで文字列として解釈します (ただし、有効な文字列になるように注意する必要があります)。これらのそれぞれにより、10^16 をはるかに超える結果が得られ、文字列が数字と混同される可能性が低くなります。
于 2012-12-06T18:39:44.503 に答える
0
可変長の 60 文字列の固有の長さは、16 文字列よりもはるかに長くなる可能性があります。
したがって、一般的な優れたアルゴリズムは不可能です。これは、一意の各文字 ( a ~ z) から数字 (0 ~ 9) を生成するようなものです。
于 2012-12-06T18:32:59.337 に答える