我想在數字和字母相同的格式生成字符串的序列位置算法以生成特定格式的唯一的字符串
e.g ABC12,DEV45,UED23,...
它也需要一個公式來從下一個字符串目前的一個。例如從上面的字符串:
f(ABC12)=DEV45
f(DEV45)=UED23
我想用它來以定義的格式生成下一個「look-random」唯一代碼。你建議什麼算法?非常感謝。
我想在數字和字母相同的格式生成字符串的序列位置算法以生成特定格式的唯一的字符串
e.g ABC12,DEV45,UED23,...
它也需要一個公式來從下一個字符串目前的一個。例如從上面的字符串:
f(ABC12)=DEV45
f(DEV45)=UED23
我想用它來以定義的格式生成下一個「look-random」唯一代碼。你建議什麼算法?非常感謝。
其中一種方法是預先計算數組形式的字母部分,然後將其與連續數字組合。對於字母數組:
AAA, AAB, AAC, ..., ABA, ABB, ..., ZZZ
開頭(總共17576個元素) - 所有可能的獨特組合;對於位部分,用簡單的計數:
00
;100
,請使用下一個字母部分 - 因此每個字符串都是唯一的。這提供了1757600個獨特的字符串,如ABC12
。
謝謝。雖然我想讓下一個元素看起來是隨機的,而不是前一個字符串的增量。我也不想使用預生成字符串的數據庫。只需輸入當前字符串的公式,並輸出下一個字符串。 – Elveryx
格式「ABC12」的代碼基本上是一個5位數的數字,其中前3位是基數爲26,最後2位是小數。有26 10或1,757,600這些。每個代碼被容易地轉化爲相應的數字和背面:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
ABC12 = (((0 * 26 + 1) * 26 + 2) * 10 + 1) * 10 + 2 = 2,812
DEV45 = (((3 * 26 + 4) * 26 + 21) * 10 + 4) * 10 + 5 = 215,345
UED23 = (((20 * 26 + 4) * 26 + 3) * 10 + 2) * 10 + 3 = 1,362,723
2,812/10 = 281 rem: 2
281/10 = 28 rem: 1
28/26 = 1 rem: 2
1/26 = 0 rem: 1
0/26 = 0 rem: 0 -> 0 1 2 1 2 -> ABC12
215,345/10 = 21,534 rem: 5
21,534/10 = 2,153 rem: 4
2,153/26 = 82 rem: 21
82/26 = 3 rem: 4
3/26 = 0 rem: 3 -> 3 4 21 4 5 -> DEV45
1,362,723/10 = 136,272 rem: 3
136,272/10 = 13,627 rem: 2
13,627/26 = 524 rem: 3
524/26 = 20 rem: 4
20/26 = 0 rem: 20 -> 20 4 3 2 3 -> UED23
要遍歷從0號到1757599以僞隨機的方式中,選擇的步長,其僅返回到零在已行進穿過每一個號碼都沒了,然後計算下一個值:
x -> (x + step) % 1,757,600
所以第一步應該有1757600沒有共同的因素:
1,757,600 = 2 * 2 * 2 * 2 * 2 * 5 * 5 * 13 * 13 * 13
並且優選地大於26 * 26 * 10 * 10,使得每個數字隨着每個步驟而改變;所以,例如:
step = 3^11 = 177,147
其給出該序列:
2,812 ABC12
( 2,812 + 177,147) % 1,757,600 = 179,959 -> CRF59
(179,959 + 177,147) % 1,757,600 = 357,106 -> FHJ06
...
這裏的一個代碼爲例來說明方法。這是因爲JavaScript有點煩人。在C語言中,字符串基本上是一個整數數組,代碼將更直接。
function nextCode(current) {
var base = [26,26,26,10,10], symbol = [65,65,65,48,48], char = [], number = 0;
for (var i = 0; i < 5; i++) {
var digit = current.charCodeAt(i) - symbol[i];
number = number * base[i] + digit;
}
number = (number + 177147) % 1757600;
for (var i = 4; i >= 0; i--) {
var remainder = number % base[i];
number = (number - remainder)/base[i];
char[i] = String.fromCharCode(symbol[i] + remainder);
}
return char.join('');
}
document.write("ABC12 → " + nextCode("ABC12"));
+1你可能會提到這個相同的原理可以用乘法步進(加上一些機制在週期中包含AAA00),或者可能通過某種完美的散列函數或具有足夠週期長度的僞隨機數發生器。 – Patrick87
是什麼的問題,唯一的意思嗎? –
@Everyveryx您正在使用哪種語言? – m69