Algorithm IDs唯一随机生成的好算法

Algorithm IDs唯一随机生成的好算法,algorithm,database-design,Algorithm,Database Design,我需要生成一个随机ID,字母数字,6个字符,作为短链接服务的ID 目前,我生成了一个随机的6个字符的代码,在数据库中查找,看看它以前是否被使用过,如果有,重复这个过程。我需要它是唯一的所有36^6组合。随着系统的增长,其性能越差 有没有已知的好方法可以最大限度地减少对数据库的访问,全局保留状态,并且查找时间不会超过100毫秒 Thx要获得任何帮助,请使用序列号,这样您就不必点击数据库来搜索密钥是否已经存在。您只需要跟踪到目前为止分配的最大数量 要使此顺序ID为字母数字,请将其转换为基数36 如果

我需要生成一个随机ID,字母数字,6个字符,作为短链接服务的ID

目前,我生成了一个随机的6个字符的代码,在数据库中查找,看看它以前是否被使用过,如果有,重复这个过程。我需要它是唯一的所有36^6组合。随着系统的增长,其性能越差

有没有已知的好方法可以最大限度地减少对数据库的访问,全局保留状态,并且查找时间不会超过100毫秒


Thx要获得任何帮助,请使用序列号,这样您就不必点击数据库来搜索密钥是否已经存在。您只需要跟踪到目前为止分配的最大数量

要使此顺序ID为字母数字,请将其转换为基数36

如果您不喜欢分配的第一个ID看起来像
000000
000001
<代码>00000z,
000010
,您可以使用一个数学技巧:在内部保留顺序数字ID,但对于用户可见的外部表示,将其(mod 36^6)乘以小于36^6-1的大素数-1679979167将是一个不错的选择-然后转换为基数36。这将使您的ID在用户看来是随机的,即使它们实际上不是

下面是一个带有输出的python示例:

def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])

for internalID in range(1,200):
    mangled = (internalID*1679979167)%(36**6)
    print internalID, mangled, baseN(mangled,36)
(baseN代码是jellyfishtree的源代码)



此问题有一个众所周知的解决方案:

只需使用LCG生成下一个随机数,然后将其转换为基数36并写入相应的伪随机字符串


祝你好运

您想从哪一组字符中提取?是否仅限于6个字符?或者像“Xy0MVKupFES9NpmZ9TiHcw”这样的22行吗?严肃的问题是,为什么短链接服务必须有随机ID?生成连续的数字ID,并使用您选择的数字集将其转换为基数36。Base64是标准的,比基数36更紧凑。6个字符将得到32位二进制,这对于“非重复”标识符来说应该足够了。@EmmadCareem-你不会从中得到很多不同的ID。(试图找出素数技巧。)所以想法是。。。您已经创建了从内部整数到用户将看到的表示的可逆映射?我想知道,连接的系统会看到什么……是的,我想要一个从[0,36^6-1]范围到自身的可逆映射,它看起来是“连续的”数字,在未经训练的人看来不是连续的。内部ID将只是序列号,而外部的所有东西、客户、用户等将只看到映射版本。(编辑并修复了一个问题-早期版本的代码忘记使用结果mod 36^6。)这也是一个非常棒的解决方案。非常感谢。如何确保生成的数字是唯一的?因为你正在做一个mod,数字可能会开始冲突。是的,这可能是最好的主意。我的想法有点过于复杂了,因为我错误地假设您需要一个从损坏的表单到顺序ID的快速可计算的逆,但是重新考虑一下,我认为这没有必要。所以对你来说+1。它有点像LCG,只是它不迭代步骤,而是与顺序ID相乘,这使得它很容易可逆。是的,这肯定不是同一件事,但也涉及素数。谢谢大家-对我的问题的回答的质量和数量令人谦卑。非常感谢大家!我要和LCG一起去。
1 1679979167 rs7s7z
2 1183175998 jkfkfy
3 686372829 bcncnx
4 189569660 34v4vw
5 1869548827 ux2x3v
6 1372745658 mpapbu
7 875942489 ehihjt
8 379139320 69q9rs
9 2059118487 y1y1zr
10 1562315318 pu5u7q
11 1065512149 hmdmfp
12 568708980 9eleno