- ベストアンサー
文字列からの一意なIDの生成、ただし、文字列長に合わせた長さ
ある文字列から一意な別の文字列を生成したいです。(なるべく短く) 現在は、可逆な暗号化によって実現できると考えて、DESによって実装してみました、しかし、文字列をBase64でひょうげんした際にずいぶんと長くなってしまうことがありました。 (10文字→30文字 くらい) このようなケースには、どのような方法を用いるのが適切なのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 暗号の法則は解読できない類のものが良いです。 もともと「可逆な暗号化によって実現できると考え」ただけで、暗号化の話ではないですよね。一意性と長さが重要なのではなかったのですか? 条件についてなら他にも、IDを管理者だけが使うのかユーザも使うのかとか、あとでIDを変更する必要が出てくるか、なども重要だと思います。ユーザが使うのなら制御文字が含まれるようなIDはダメだろうとか、注意点が増えますから。あまりいい回答がつかないようなら、一度条件を整理された方がよいでしょう。 また暗号化アルゴリズムを使うにしても、解読できないアルゴリズムは存在しません。解読にどれだけ時間がかかるか、がアルゴリズムの優劣の指標になっています。「金銭に関わる」「IDから元の文字列を類推しようとする人が現れる可能性が高い」といった、セキュリティに重点を置かなければならないシステムを構築するのでなければ、あまり神経質になることはないかと。それにシーザー暗号(シーザリオン、よりこの呼び方が多いようで)そのものを使ったら確かに容易に解読されるでしょうが、工夫すれば解読を難しくすることはできますし、単一換字式暗号を使うのが、文字数としては一番短くできると思います。 参考: http://contest2007.thinkquest.jp/tqj2007/90242/kanzi.html あとは発想を変えて、よくある桁固定の数値ID(バーコードみたいな)にするのはどうでしょう。ある桁に意味を持たせたりできますし、登録順に数字を割り当ててしまえば一意性は保たれます。元の文字列の長さにも依存しません(IDより短いものからすれば長くなってしまいますが)。 もしくは文字列をzip等で圧縮して、バレないようにヘッダを削るとか。必ずしも元の文字列より短くなるわけではないし、「読める文字列」にはならないですが。 さらには文字列が登録されるたびに、ランダムにID文字列を作って返すという手もあります。もちろん紐付け情報を保存しなければなりませんが。 このあたりは前述の「条件」が出揃っていないので使えるか分かりませんが、一応参考ということで挙げておきます。
その他の回答 (1)
- komi1341
- ベストアンサー率65% (25/38)
シーザリオン暗号とかどうでしょう。アルファベットを3文字進める、みたいなやつです。 一意性は自明、文字数は元の文と同じ。実装も、文字コードをnプラスする、みたいなノリなので簡単です。
補足
申し訳ありません。補足が必要でした。 暗号の法則は解読できない類のものが良いです。