我的数字在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
Sweeeeeet: - )
答案 0 :(得分:3)
您可以将数字1到62放在一个数组中并随机播放该数组(例如使用Fisher-Yates shuffle)。然后将数组的索引映射到该单元格的内容(但如果使用0索引数组,请注意一个错误的错误。)
为了使其成为确定性,请使用随机数生成器的特定种子。
编辑:计算成本较低(也更容易猜测)的映射是乘以某个常数然后计算结果模62:
result = (input * 37) % 62
37号只是一个例子。你可以使用任何coprime到62的数字 - 除31之外的任何奇数。
答案 1 :(得分:1)
按照马克拜尔斯的评论。找到x
mod n的倒数(例如,n = 62)。
让x
成为区间[1, n]
中的输入整数。使用extended Euclidean algorithm查找y
和t
以查找xy + nt = 1 mod n
。然后是y = x^{-1} mod n
。
答案 2 :(得分:1)
答案 3 :(得分:0)
使用RSA。这很容易实现(好吧,取决于语言),这里是worked example。