長い(最大60文字)文字列の自然キーを使用してデータソースからダンプとして定期的に送信されるデータがあり、エンドユーザーには関係ありません。このキーをURLで使用しています。これにより、URLが長すぎて、ユーザーにとって使い勝手が悪くなります。
次の要件で文字列キーを整数に変換したいと思います。
ソースデータセットは時間の経過とともに変化します。
IDは次のようになります。
- 非負の整数
- 入力キーのセットが変更されても一意で一定
- できればキーに戻すことができます(強い要件ではありません)
データベースは毎回ゼロから再構築されるため、すでに割り当てられているIDを思い出せず、新しいデータセットを既存のIDと照合して、追加されたキーのシーケンシャルIDを生成できません。
現在、約30000の異なるキーがあり、セットは絶えず成長しています。
文字列キーを整数IDにマップする関数を実装するにはどうすればよいですか?
私が考えたこと:
1.
組み込みのstring.GetHashCode:
ID(key) = Math.Abs(key.GetHashCode())
- 一意であるとは限りません
- (リバーシブルではありません)
1.1
衝突を防ぐために一意のIDが生成されるまで、組み込みのGetHashCodeを「再ハッシュ」します。
- 入力データセットの先頭に衝突するものが追加されると、既存のIDが変更される可能性があります
2.
完璧なハッシュ関数
- 入力のセットが変更された場合にこれが定数IDを生成できるかどうかはわかりません
- (リバーシブルではありません)
3.
ベース36/64/に変換しますか?
- 長いキーを十分に短くしません
他のオプションは何ですか?