生成由数字/字母组成的唯一字符串

Generate a UNIQUE string made out of numeric / ALPHABET

我的问题


故事

我很难搞清楚如何创建一个字符串生成器(没有说它必须是随机的,但它必须 100% 是唯一的,这意味着它必须检查重复或存储现有的值),我没有使用 VBA 的经验。我已经在这里找到了类似的 post,但它与我的不同,因为它没有特别要求字符串 100% 唯一。 (我不需要很低的几率,我需要的是全线100%)。

语法方面我很困惑,我设法找到事件背后的代码在哪里,即按钮按下,所以我知道我需要在哪里写它,但我不知道如何检查重复。 (即使依靠可以确保它 100% 唯一的时间种子也很棒)。

Link 类似于 post: MS Access Visual Basic - generate random string in text field

使用日期时间字符串:

  • 公式:=TEXT(NOW(),"yymmddhhmmss") -> 170705161201

  • VBA: Debug.Print Format(Now, "yymmddhhmmss")

这个问题有多种解决方案,但我喜欢这个:

Public Function newguidx() As String
    With CreateObject("Scriptlet.TypeLib")
        newguidx = Left(.Guid, 38)
    End With  
End Function

它创建了一个 GUID。这些本身并不是独一无二的,但您可以在维基百科页面上阅读它们也可能是独一无二的。如果需要,您可以使用 Replace 删除 {}- 符号。

此外,由于格式是标准化的,大多数程序员都清楚它是什么。

显然,您可以 trim 个字符来获得您想要的长度,这会增加您找到重复项的机会。

编辑:

遗憾的是,出于安全原因,目前默认阻止访问 Scriptlet.TypeLib。有关生成 GUID 的多种方法的详细概述,请参阅 for information on that, and How can I generate GUIDs in Excel?

个人喜好:

Public Function CreateGUID() As String
    Do While Len(CreateGUID) < 32
        If Len(CreateGUID) = 16 Then
            '17th character holds version information
            CreateGUID = CreateGUID & Hex$(8 + CInt(Rnd * 3))
        End If
        CreateGUID = CreateGUID & Hex$(CInt(Rnd * 15))
    Loop
    CreateGUID = "{" & Mid(CreateGUID, 1, 8) & "-" & Mid(CreateGUID, 9, 4) & "-" & Mid(CreateGUID, 13, 4) & "-" & Mid(CreateGUID, 17, 4) & "-" & Mid(CreateGUID, 21, 12) & "}"
End Function

好吧,我想如果它真的需要字母数字和唯一性,这就是要走的路:

这段代码根据当前时间生成一个随机字符串(就像@paul-bica 的回答),只是它按字母数字方式对它们进行编码,并使用计时器来获得几分之一秒以达到 12 个字符)。这样你应该能够每秒生成多个随机字符串。

只需调用 UniqueTimeBasedString() 即可获取字符串。 (请注意,如果您在查询中使用此函数,Access 将缓存结果并且它根本不是唯一的)。

Public Function UniqueTimeBasedString() As String
    Dim alphanumericCharacters As String
    alphanumericCharacters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Dim timeString As String
    timeString = Format(Now, "yymmddhhmmss") & Getmtimestring(6)
    Dim c As Integer
    Dim intTimepart As Integer
    c = 1
    Do While c < Len(timeString)
        intTimepart = CInt(Mid(timeString, c, 3))
        c = c + 3
        UniqueTimeBasedString = UniqueTimeBasedString & Mid(alphanumericCharacters, Int(intTimepart / 61) + 1, 1) & Mid(alphanumericCharacters, intTimepart Mod 61 + 1, 1)
    Loop
End Function

Public Function Getmtimestring(length As Integer) As String
    Dim mtime As Double
    mtime = Timer()
    Dim mtimeLng As Long
    mtimeLng = Int((mtime - Int(mtime)) * (10 ^ length))
    Getmtimestring = CStr(mtimeLng)
    Do While Len(Getmtimestring) < length
        Getmtimestring = "0" & Getmtimestring
    Loop
End Function

备注:

  1. Timer() 不是很准确,理论上这会导致 问题
  2. 此代码与 OS X 不兼容,但如果您仅限于访问,那将不是问题(Getmtimestring 将 return 零)
  3. 你真的应该和你的老板谈谈。在紧迫的期限内要求您做一些您并不真正胜任的事情,没有选择使用稍微其他的解决方案是不健康的工作场所行为。
  4. 该字符串包含编码时间,可以解码。如果你想保密字符串的创建时间,请不要报告它。