0

生成长度为 25 个字符的 unquie ID(无特殊字符)的最佳方法是什么?我正在考虑生成一个 GUID 并获取它的子字符串,但我不知道这是否是唯一性的最佳想法。

这适用于断开连接的系统使用。在我的情况下,在数据库中创建主键不起作用。我需要手动创建一个 unquie ID

我试过了,但由于某种原因,我在输出中看到了重复项。因此,即使在这个简单的测试中,它似乎也不会太不安..

 Sub Main()
        Dim sb As StringBuilder = New StringBuilder
        For i As Integer = 1 To 100000
            Dim s As String = GenerateRandomString(25, True)
            sb.AppendLine(s)
            sb.AppendLine(Environment.NewLine)
        Next
        Console.WriteLine(sb.ToString)
        Console.ReadLine()
    End Sub

    Public Function GenerateRandomString(ByRef len As Integer, ByRef upper As Boolean) As String

        Dim rand As New Random()

        Dim allowableChars() As Char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ0123456789".ToCharArray()

        Dim final As String = String.Empty

        For i As Integer = 0 To len - 1

            final += allowableChars(rand.Next(allowableChars.Length - 1))
        Next

        Return IIf(upper, final.ToUpper(), final)

    End Function
4

3 回答 3

3

您可能会看到重复项,因为New Random()它是根据系统时钟播种的,而下一次迭代可能不会改变。

尝试加密安全的 RNG:

Const ALLOWABLE_ALL As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Const ALLOWABLE_UPPERCASE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Dim allowable As String = If(upper, ALLOWABLE_UPPERCASE, ALLOWABLE_ALL)
Dim result(len - 1) As Char
Dim current As Integer = 0

Using r As New Security.Cryptography.RNGCryptoServiceProvider()
    Do
        Dim buffer(255) As Byte
        r.GetBytes(buffer)

        For b As Byte In buffer
            If b < allowable.Length Then
                result(current) = allowable(b)
                current += 1
                If current = len Then Return New String(result)
            End If
        Next
    Loop
End Using

upper这也比您的实现“更随机”,因为如果is ,字母的权重不会增加两倍True

于 2013-09-20T21:11:43.073 回答
1

GUID 可能是 32 位数字,但仅限于以十六进制表示。这意味着它只会使用字符 0-9 和 AF。如果您的字符串可以使用整个字母表,那么您可以用更少的字符表示相同的 GUID,特别是如果您的字符串可以区分大小写。

有关替代编码的示例,请参见http://en.wikipedia.org/wiki/Globally_unique_identifier#Text_encoding ,或http://web.archive.org/web/20100408172352/http://prettycode.org/2009/11/ 12/short-guid/例如代码。编辑:或者上面的汉斯方法要好得多。如果您想对仅使用 AZ、az 和 0-9 字符的 GUID 进行编码,那么您将需要查找 Base-62 编码(而不是 base-64),因为您只有 62 个字符可以编码。

于 2013-09-20T20:42:41.337 回答
0

停止尝试重新发明轮子,只需使用 .NET 的内置 GUID 生成器:

System.Guid.NewGuid()

这将生成一个正确随机播种的 GUID,然后只需将其子串到您的限制。如果您抓取最后 25 个字符而不是前 25 个字符,那就更好了。

PS:总的来说,我不认为这是一个好主意,因为它是整个 GUID 被认为是唯一的,而不是它的一部分,但它应该满足您的需求。

于 2013-09-20T20:53:55.303 回答