最有效的方法......惟一的随机字符串(Most Efficient Way to… Unique

2019-08-17 05:31发布

我需要efficently插入5个字符的随机字符串到数据库中,同时确保它是独一无二的。 生成随机字符串是没有问题的,但是目前我在做什么正在生成的字符串,然后检查数据库,如果它已经存在......如果是这样,我开始了。

有没有更有效的方法来做到这一点的过程?

请注意,我不想使用GUID或其他任何超过5个字符....我一定要坚持5个字符。

PS:我不认为它的确与众不同,但我的琴弦都是区分大小写的。

这里是“随机字符串”部分

    Public Function GetRandomNumbers(ByVal numChars As Integer) As String
    Dim chars As String() = { _
     "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", _
     "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"}
    Dim rnd As New Random()
    Dim random As String = String.Empty
    Dim i As Integer = 0
    While i < numChars
        random += chars(rnd.[Next](0, 62))
        System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
    End While
    Return random
End Function

Answer 1:

与按顺序添加(所以他们是唯一的)5字符字符串的一个大池创建一个表,并有一个GUID作为其主键。 添加列以表示它们是否使用与否。

当你需要一个新的号码,你从池中选择,由GUID顺序最高的1(所以它变成随机的),结果设置为“花”。



Answer 2:

你可以生成一个GUID并且只能使用前5个字符?



Answer 3:

随机性是更重要的,还是独特性更重要? - 注意,我说的“更”重要的; 我得到你需要两个事实。

如果随机性是更重要的,那么你会需要一些方法来跟踪历史价值。 该数据库本身(用适当的指数)将是做到这一点的最好办法。

如果独特性更重要,那么只需使用一个计数器,它零到五位数。 这将当然,限制你100,000行,所以你可以替代地使用一个计数器和一个转化字符的空间(例如,1 =“A”,2 =“B”,27 =“AA”,等等) 。



Answer 4:

有随机挑选未使用的唯一字的方法,但它可能不会是任何比你现在正在做什么好。

其原理是,你确定哪些是不用的话排列,基于有多少闲置permuations有一个随机数,并挑选一个。

比如你会使用三个字符的文字,只有字符0和1,有八个可能的排列。 如果你已经使用了组合“010”和“100”,你会得到的东西看起来是这样的:

PI =置换索引
UI =未使用的置换索引

No. PI UI
----------
000 0  0
001 1  1
010 2  -
011 3  2
100 4  -
101 5  3
110 6  4
111 7  5

挑选一个未使用的置换,只需产生一个随机数为0〜5,并挑选相应置换。

保持所有可能permuations清单当然不实用,所以你需要的是能够确定从字符串的置换索引,以及一个功能,能够确定从置换索引字符串的函数。

此外,以确定哪些排列是不用的,你必须检查其使用的,所以你还是要查询表在一些点。



Answer 5:

如果您要插入的字符串到现有的,稀少,这时你总是需要检查字符串不存在那里(它没有成为一个明确的选择)。 您可以将它手动,或对列的UNIQUE约束,让数据库来做到这一点。 所以,如果因为字符串是已经存在的数据库返回一个错误,产生一个又一个。

请注意,如果你有一个空表,并希望与多个随机的字符串来填充它,这是一个不同的问题。



Answer 6:

我想你应该坚持你的原始想法。 把对指数的唯一约束,让数据库检查/报告愚弄你会欺骗检查相当effecient方法,但这种假设依赖于未提供类似的行数和遇到随机抽取的数据愚弄的情形产生的一些信息。

完全预填充您的参数唯一的序列池需要459万行的表。

你可以使用一个布隆过滤器,以易于管理的统计数据加载到数据库或主存,避免受骗者但根据行数和过滤器的配置,这可能会导致过滤器的饱和度,当行数的4.59亿限可观的比例。由于滤波器可以报告误报你应该工作,以确保你没有得到进入您的系统粘连试图通过过滤器永远接近排列的情况。



Answer 7:

你知道你的话应该有多长,为什么不基于树的方法吗? (我们称之为随机树径)

说你的字有n个字符。 生成集合S中所有符号s的列表,并涉及该串中的每个符号的计数器和可能的位置,基本上尺寸s乘以矩阵M×N个。 现在,滚你的骰子,然后选择第一个字母和查找M(S,1)。 如果M(S,1)是大于或等于的开始与S可能的单词的数目,再次滚动。 否则增量M(S,1)。

重复此为每个字母1日至ñ。

直到你已经使用了许多单词应该是相当快。



文章来源: Most Efficient Way to… Unique Random String