【发布时间】:2013-02-25 18:37:22
【问题描述】:
我想从一个 32 位正整数生成一个 6 字符的字母数字代码(例如 A3SJ8D),其中序列中的每个代码看起来都与前一个不同。
- A3SJ8D
- G54FGS
- ...
此代码必须是可逆的,以便 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;
}
【问题讨论】:
-
1-1 映射?一个给定的整数可以有多个字母数字代码?负整数呢?
-
"Simplest implementation wins"听起来更像是CodeGolf。投票结束。 -
你试过什么?你说的胜利是什么意思?这是一种竞争吗?
-
唯一的 32 位整数 = 4,294,967,296 & 唯一的六字符字母数字 = ((26+10)^6) = 2,176,782,336...简单地说,不可能。
-
@jurgenreza 大概 OP 意味着获胜者得到了接受的答案,但这不适合 SO。
标签: algorithm random cryptography