[英]Algorithm to generate a unique string of a certain format
我想生成一个数字和字母位置格式相同的字符串序列
e.g ABC12,DEV45,UED23,...
还需要一个公式来从当前字符串生成下一个字符串。 例如,从上面的字符串:
f(ABC12)=DEV45
f(DEV45)=UED23
我想用它来以定义的格式生成下一个“外观随机”唯一代码。 您建议使用哪种算法? 非常感谢。
格式为“ ABC12”的代码基本上是5位数字,其中前3位以26为基数,后2位为十进制。 其中有26×26×26×10×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到1,757,599之间的数字,请选择一个步长,该步长在遍历每个数字后仅返回零,然后将下一个值计算为:
x -> (x + step) % 1,757,600
所以step应该没有1,757,600的共同因素:
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"));
一种方法是预先计算数组形式的字母部分,然后将其与连续数字组合。 对于字母数组:
AAA, AAB, AAC, ..., ABA, ABB, ..., ZZZ
(总共17576个元素)-所有可能的独特组合; 对于数字部分,请使用简单的计数:
00
开始; 100
,请使用下一个字母部分-这样每个字符串都是唯一的。 这提供了1757600个唯一字符串,如ABC12
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.