Почему мой «код случайного ключа» время от времени создает один и тот же ключ? - PullRequest
0 голосов
/ 01 ноября 2019

У меня следующий код, из которого я извлекаю randomPW для своей базы данных.

Мне нужна эта строка случайных символов, чтобы использовать ее в качестве первичного ключа в моей базе данных. Проблема в том, что я получаю довольно много дубликатов, когда я выполняю этот код более одного раза или если я получаю цикл для извлечения (например) 100 ключей одновременно.

Если я пытаюсьперезагрузите страницу, чтобы вставить один за другим ключ, возникает та же проблема ... каждые 50-80 перезагрузок появляется дубликат. Можете ли вы сказать мне, что не так с моим кодом?

    <%
    Function RandomPW(myLength)
    Const minLength = 6
    Const maxLength = 20

    Dim X, Y, strPW

    If myLength = 0 Then
    Randomize
    myLength = Int((maxLength * Rnd) + minLength)
    End If


    For X = 1 To myLength
    Y = Int((3 * Rnd) + 1) '(1) Numeric, (2) Uppercase, (3)   Lowercase

    Select Case Y
    Case 1
    'Numeric character
    Randomize
    strPW = strPW & CHR(Int((9 * Rnd) + 48))
    Case 2
    'Uppercase character
    Randomize
    strPW = strPW & CHR(Int((25 * Rnd) + 65))
    Case 3
    'Lowercase character
    Randomize
    strPW = strPW & CHR(Int((25 * Rnd) + 97))

    End Select
    Next    
    RandomPW = strPW
    End Function
    %>

Я ожидаю, что мой код будет извлекать жало, которое не будет время от времени дублировать.

Ответы [ 2 ]

4 голосов
/ 01 ноября 2019

Мне нужна эта строка случайных символов, чтобы использовать ее в качестве первичного ключа в моей базе данных.

В этом случае я бы рекомендовал использовать Scriptlet.TypeLib :

Function RandomPW(myLength)
    Set TypeLib = CreateObject("Scriptlet.TypeLib")
    If myLength < Len(TypeLib.Guid)
      RandomPW = Left(TypeLib.Guid, myLength)
    Else
      RandomPW = TypeLib.Guid
   End If
End Function
3 голосов
/ 01 ноября 2019

Randomize не должен использоваться более одного раза, если только вы не хотите убедиться, что вы создаете поддельную, повторяемую случайность. В соответствии с документами, которые в свою очередь связаны с Lankymart (выделено мной):

Randomize использует число для инициализации генератора случайных чисел функции Rnd, давая ему новое начальное значение. Если вы опустите число, значение, возвращаемое системным таймером, будет использоваться в качестве нового начального значения.

Системный таймер, указанный выше, указывается в секундах;Это означает, что последовательные вызовы Randomize в короткой последовательности обеспечат то же значение, что и следующий Rnd.

Это, вероятно, поможет вам безмерно удалить все вызовы Randomize.

...