32ビットの正の整数から6文字の英数字コード(A3SJ8Dなど)を生成したいと思います。この場合、シーケンス内の各コードは前のコードと同じようには表示されません。
- A3SJ8D
- G54FGS
- ..。
たとえば、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;
}