5

我想从一个 32 位正整数生成一个 6 字符的字母数字代码(例如 A3SJ8D),其中序列中的每个代码看起来都与前一个不同。

  1. A3SJ8D
  2. G54FGS
  3. ...

此代码必须是可逆的,以便 G54FGS 可以转换回 2,例如(1:1 映射)。

这种“随机性”不是为了安全目的,而是为了非常简单的混淆。换言之,该方法不必是“安全的”。

编辑

澄清一下,我知道无符号 32 位整数 (2^32)-1 的最大可能值超过了使用 10 位数字和 26 个字母的 6 字符字母数字代码的最大可能值 (36^ 6)-1。因此,要编码的正整数不能超出由代码集可用字符数建立的界限。

回答!

例子

这是基于@nwellnhof 下面接受的答案的 Javascript 中的简单代码示例。


var Skip32 = require('skip32').Skip32,
    key = "0123456789".split("").map(function(c) { return c.charCodeAt(0) }),
    cipher = new Skip32(key),
    codelen = 6,
    radix = 36,
    max = Math.pow(radix,codelen);

function numToCode(num) {
    while ((num = cipher.encrypt(num)) >= max) {}
    return num.toString(radix).toUpperCase();
}

function codeToNum(code) {
    var num = parseInt(code,radix);
    while ((num = cipher.decrypt(num)) >= max) {}
    return num;
}
4

2 回答 2

2

我会使用 SKIP32 密码,它是基于 Skipjack 的 32 位分组密码。只需选择一个随机密钥,加密整数,然后以 36 为基数输出结果。您可以在此处找到 C 语言的实现。

于 2013-02-25T19:09:21.150 回答
1

如果您将 1,2,3,... 乘以一个相当大的奇数整数并使用基数 36 转换为字符串,您将获得一系列看起来相当随机的代码。

例如,如果你乘以 123456789,你会得到以下 1、2、3、4 的序列:

1: 21i3v9
2: 4307qi
3: 64iblr
4: 860fh0

要反转运算,请乘以乘法逆运算,例如 123456789 中的 102505021。

为了使序列看起来更“随机”,您可以使用异或或加法进一步打乱数字。

事实上,这就是伪随机数的线性同余生成器的工作原理。

于 2013-02-25T20:07:36.730 回答