4

Auto Incr を使用して、MySQL テーブル フィールド (question_id) の整数を使用した短い一意の文字列 ID を導入したいと考えています。

ユーザーが www.something.com/SjBWY を指す場合 -> php は id=23511 のレコードをフェッチします。

質問の数に関する情報を非表示にして、ある種の変換アルゴリズムを使用して question_id に 1 対 1 でマップされる question_code を導入したいと考えています。データベースに question_code を保存したくありません。MySQL 開発者は私より賢く、一意の番号を生成するための信頼できるメカニズムを作成したと思います。

単純なアプローチ: ( http://ideone.com/rK4hzx )

$num = 11231;

while($num > 0) {
    $v = ord( $num % 10);
    $v += 25;
    echo chr($v);

    $num = round($num / 10);
}
// JLKJJ

$result = array_reverse(str_split('JLKJJ'));
foreach ($result as $single) {
 echo chr(ord( $single)-25);
}
// 11231

質問:より良い解決策を提案していただけますか?

単純なアプローチの弱点:

  • 小文字も大文字も使えるようにしたい
  • 文字列の長さをできるだけ 5 に制限できるようにしたい。
  • 生成された文字列では、シーケンスが明らかであってはなりません。11 の値は、12 から可能な限り離れている必要があります。

EDIT アルゴリズムは対称である必要があります。これは、Int->String および String->Int を変換できることを意味します。MD5 およびその他のハッシュ アルゴリズムは一方向のみです。String->Int から変換することはできません。

4

3 に答える 3

1

衝突の可能性があるため、ハッシュは適切なオプションではありません。全単射変換が必要なもの。

たとえば、ID を暗号化できます...

必要に応じて、結果のビット文字列を base64 エンコードするか、6 ビット チャンクと文字マップを使用して何かをエンコードします ([a-zA-Z0-9_-] など)。

何をするにしても、逆変換を合理的に簡単に実行できることを確認してください。

于 2013-06-02T16:27:01.713 に答える
0

一意の文字列 ID を取り、それをバイトに変換してから long/int に変換しないのはなぜですか? 変換して戻すには、long/int をバイトに変換してから文字列に変換します....

于 2013-06-02T19:36:29.697 に答える