我想从32位正整数生成一个6个字符的字母数字代码(例如A3SJ8D),其中序列中的每个代码都与前一个代码不同。
此代码必须是可逆的,以便G54FGS可以转换回2,例如(1:1映射)。
这种“随机性”不是出于安全目的,而是出于非常简单的混淆。换句话说,该方法不必是“安全的”。
修改
为了澄清,我理解无符号32位整数(2 ^ 32)-1的最大可能值超过了使用10位数和26个字母的6个字符的字母数字代码的最大可能值, (36 ^ 6)-1。因此,要编码的正整数不得溢出由代码集可用字符数确定的边界。
示例
以下是Javascript中基于@nwellnhof接受的答案的简单代码示例。
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;
}
答案 0 :(得分:2)
我将使用SKIP32密码,这是一个基于Skipjack的32位分组密码。只需选择一个随机密钥,加密整数,然后在基数36中输出结果。您可以在C here中找到一个实现。
答案 1 :(得分:1)
如果将1,2,3,...乘以相当大的奇数整数并使用基数36转换为字符串,您将获得一系列相当随机的代码。
例如,如果乘以123456789,则会得到以下1,2,3,4的序列:
1: 21i3v9
2: 4307qi
3: 64iblr
4: 860fh0
通过乘法逆来反转操作,例如在123456789的情况下为102505021。
要使序列看起来更“随机”,您可以使用xor或加法进一步加扰数字。
实际上,这就是linear congruential generator伪随机数的工作原理。