如何生成随机字符串类型的主键,可以自动增加其长度?

How to generate random string type primary key, which can auto increase its length?

如果我的table需要使用字符串类型作为主键,长度是可以增加的,并且尽可能短,并且可用时,在某种意义上应该是随机的,如何我做那个?

例如:
给定 26 个字母,结果应该是这样的:

假设您只是想要一些混淆而不是适当的加密安全性,我建议使用一组 linear congruential generators 将您的整数转换为非顺序值,然后您可以将其转换为 base-26每个数字由字母表示的值(例如,a=0、b=1、...、z=25)。

您需要为每个长度的字符串使用不同的 LCG,但这些可以很容易地生成。此外,必须调整输入值,例如,第一个两个字符的字符串对应于输入值 26。(我从零开始计数,因为这使数学更简单一些。)

例如,假设您以 n=12345 的值开始。您需要做的第一件事是弄清楚输出字符串需要多长:

n = 12345       # Input value
m = 26          # LCG modulus
k = 1           # Length of output string

while n >= m:
    n -= m
    m *= 26
    k += 1

print(k)        # Should be 3 in this case
print(n)        # Should be 11643 (=12345 - 26 - 26**2)

接下来,用模数为m=263[的LCG变换n的输出值(对于 3 个字符的输出)。例如,您可以尝试 a=7541 和 c=12127。 (根据维基百科文章中描述的 Hull–Dobell 定理,确保您选择的值对应于最大长度序列。)

n_enc = (n * 7541 + 12127) % (26**3)    # Should be 2294

在base 26中,数字2294表示为3×262 + 10×26 + 6,所以最终输出将是dkg.

要反转此过程,将 base-26 字符串转换回整数,应用反 LCG 函数

n = ((n_enc + 5449) * 3277) % (26**3)   # Should be 11643

并加回 26 的较小次方:

while m > 26:
    m //= 26
    n += m

此方法中的一个小问题是,如果字母表的长度不能被任何大于 1 的正方形整除(例如,26 = 2×13 不能被 4、9 或 16 整除),那么 LCG对于单字符字符串,不可避免地会产生顺序结果。您可以通过使用字母表的随机排列来表示 base-26 数字来解决此问题。

我还应该添加一个标准警告,即随机的字母字符串有时会拼写出令人反感或不恰当的单词,因此如果这些字符串将对用户可见,您可能需要考虑限制自己使用去元音字母完全没有。