string - 生成特定格式的唯一字符串的算法

标签 string algorithm sequence

我想生成一个数字和字母位置格式相同的字符串序列

e.g ABC12,DEV45,UED23,...

还需要一个公式来从当前字符串生成下一个字符串。例如上面的字符串:

f(ABC12)=DEV45
f(DEV45)=UED23

我想使用它以定义的格式生成下一个“外观随机”的唯一代码。你建议什么算法?非常感谢。

最佳答案

“ABC12”格式的代码基本上是一个 5 位数字,其中前 3 位数字为 base-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 &rarr; " + nextCode("ABC12"));

关于string - 生成特定格式的唯一字符串的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45704431/

相关文章:

c - 输出中的双数组字符串互连 - C 编程

string - PowerShell - 如何在字符串中的第一个反斜杠之前插入一个冒号?

algorithm - 数组中值变换最小步骤

java - 将元素从数组传递到链表

r - 基于 R 中的分组变量创建序列

javascript - 将 JavaScript 中的大字符串与散列进行比较

c++ - 给定条件下长度 N 个数内的所有可能序列

sql - 如何检查序列是否大于某个数字,以及是否在Postgres中进行更改

sql-server - 使用 EF Core 3.1 为 SQL Server 序列获取 "NEXT VALUE FOR"- 不可能吗?

c# - 从字符串中删除重复值