【问题标题】:Generate random looking code from consecutive integers [closed]从连续整数生成随机外观代码[关闭]
【发布时间】:2013-02-25 18:37:22
【问题描述】:

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

  1. A3SJ8D
  2. G54FGS
  3. ...

此代码必须是可逆的,以便 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


【解决方案1】:

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

【讨论】:

  • 32 位分组密码看起来正是我正在寻找的。任何变化都应该这样做。而且由于我真的只需要前 30 位(所以我不会溢出 6 个字符),我可以使用这里描述的折叠方法。 blog.notdot.net/2007/9/…
【解决方案2】:

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

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

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

要逆运算乘以乘法逆元,例如 123456789 的情况下为 102505021。

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

事实上,这就是linear congruential generator 的伪随机数的工作原理。

【讨论】:

  • 我想过做这样的事情,但后来我限制了我可以生成的 6 字符代码的数量。我想要至少十亿个可能的代码。感谢您的回答。
  • 奇数模乘以二的幂是一对一的。没有限制。
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2013-08-13
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多