4

私は 1 から 62 の範囲の数字を持っています。それらを「暗号化」できるようにしたいので、それらが何らかの順序で生成されたと推測するのは困難です。

したがって、たとえば、いくつかのマッピングである必要があります

1->35 2->19 3->61 ...

1 対 1 のマッピングで、100% リバーシブルです。


マッピングをハードコードすることはできますが、それよりも数値を引数として取り、1 ~ 62 の範囲の数値を生成し、重複を生成しない数式のような数学的なソリューションを好むでしょう。この式が存在する可能性はありますか?


履歴のために、検証スクリプト:

<?
  $test = array();

  $val = 37;
  for($i=0;$i<62;$i++)
  {
    if($test[($i*$val)%62])
    {
      print("Collision: $i ".$test[($i*$val)%62]."<br/>");
    }
    $test[($i*$val)%62] = $i;
    print("$i => ".(($i*$val)%62)."<br/>");
  }

?>

アップデート:

これらの回答のおかげで生成された ID は次のとおりです。

qpOLHk
NMb84H
aI740D
x5urn0
UsROKn
hPeb7K
EcByu7
1zYVRu
oWlieR
LjIFBe
8G52YB
v3splY
SqPMIl
fNc95I
Cazws5
ZxWTPs
mUjgcP
JhGDzc
6E30Wz

甘い :-)

4

4 に答える 4

3

1 から 62 までの数字を配列に入れ、その配列をシャッフルすることができます (たとえば、Fisher-Yates shuffleを使用します)。次に、配列のインデックスがそのセルのコンテンツにマップされます (ただし、インデックスが 0 の配列を使用する場合は、1 つずれるエラーに注意してください)。

決定論的にするには、乱数ジェネレーターに特定のシードを使用します。

編集:計算コストが低く(そして推測しやすい)マッピングは、定数を掛けてから、結果をモジュロ62で計算することです:

result = (input * 37) % 62

37という数字はほんの一例です。62 と互いに素な数、つまり31 以外の任意の奇数を使用できます。

于 2010-12-12T02:46:10.563 に答える
1

Mark Byers のコメントに沿って。mod nの逆数を求めますx(たとえば、n=62)。

x間隔内の入力整数にします[1, n]拡張ユークリッド アルゴリズムを使用してytなどを見つけますxy + nt = 1 mod n。それからy = x^{-1} mod n

于 2010-12-12T03:17:15.957 に答える
1

マニュアルページのこのコメントを見てください。str_rot13()

于 2010-12-12T03:48:06.900 に答える
0

RSAを使用します。実装は非常に簡単で (言語によって異なります)、実際のを次に示します。

于 2010-12-12T02:44:34.567 に答える