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 索引数组,请注意非一错误)。

为了使其具有确定性,请为随机数生成器使用特定的种子。

编辑:计算成本较低(也更容易猜测)的映射是乘以某个常数,然后计算结果模 62:

result = (input * 37) % 62

37 号只是一个例子。您可以使用任何与 62互质的数字——即除 31 之外的任何奇数。

于 2010-12-12T02:46:10.563 回答
1

按照马克拜尔斯的评论。求 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 回答