65.9K
CodeProject 正在变化。 阅读更多。
Home

在 VB.NET 中生成随机字符串密钥

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (19投票s)

2005年7月28日

2分钟阅读

viewsIcon

189147

downloadIcon

3682

一个稍微更智能的随机字符串生成器。

Sample Image

引言

我需要创建一个代码片段,来生成一组随机生成的密钥。每个密钥必须由字母和数字组成,并且字母可以是小写或大写(随机)。

在网上查看了一些示例代码后,我找不到我需要的东西。我找到的所有示例要么只生成数字,要么只生成字母。我还希望这个随机密钥基于某种规则,使其“不是直接的”随机,因此,我编写了这个小代码片段。

使用代码

它的工作方式如下:

你提供一个字母字符串:KeyLetters,一个数字字符串:KeyNumbers,以及你希望随机密钥的字符数:Keychars。然后我们调用 Generate(),它通过 Randomize() 语句和 Rnd() 函数生成一个随机数。

Rnd() 乘以 111 - 可以选择任何足够大的数字,使其值大于零。如果结果是偶数,那么我们的随机字符将是字母。如果得到奇数,那么我们的随机字符将是数字。要生成一个随机字符,我们为其中一个字符数组生成一个随机索引(取决于我们的随机字符是什么)。一旦我们得到一个索引 >= 0,我们就使用它来获取字符数组中相应索引处的值。

如果我们要生成一个数字,那么这就是我们的随机字符。如果我们要生成一个字母,那么我们需要确定是想要大写还是小写。为此,我们将 Rnd() 的值乘以 99 - 也可以是任何其他数字 - 然后确定结果是偶数还是奇数。这次,如果得到奇数,我们就将字母大写,否则保持原样。

依此类推,… 循环会持续“循环”,同时使用 StringBuilder 来构建我们的结果字符串,直到生成所需数量的随机密钥字符。我们将 StringBuilder 转换为 String 并通过函数返回它。

注意:源代码中的 XML 注释是使用“VBXC - VB.NET XML Commentor beta 3”生成的。我强烈推荐它。

Module1.vb

Module Module1
    Sub Main()
        Dim KeyGen As RandomKeyGenerator
        Dim NumKeys As Integer
        Dim i_Keys As Integer
        Dim RandomKey As String

        ''' MODIFY THIS TO GET MORE KEYS    - LAITH - 27/07/2005 22:48:30 -
        NumKeys = 20

        KeyGen = New RandomKeyGenerator
        KeyGen.KeyLetters = "abcdefghijklmnopqrstuvwxyz"
        KeyGen.KeyNumbers = "0123456789"
        KeyGen.KeyChars = 12
        For i_Keys = 1 To NumKeys
            RandomKey = KeyGen.Generate()
            Console.WriteLine(RandomKey)
        Next
        Console.WriteLine("Press any key to exit...")
        Console.Read()
    End Sub
End Module

RandomKeyGenerator.vb

Option Strict On
Imports System.Text
''' <date>27072005</date><time>070339</time>
''' <type>class</type>
''' <summary>
''' REQUIRES PROPERTIES: KeyLetters, KeyNumbers, MaxChars
''' </summary>
Public Class RandomKeyGenerator
    Dim Key_Letters As String
    Dim Key_Numbers As String
    Dim Key_Chars As Integer
    Dim LettersArray As Char()
    Dim NumbersArray As Char()

    ''' <date>27072005</date><time>071924</time>
    ''' <type>property</type>
    ''' <summary>
    ''' WRITE ONLY PROPERTY. HAS TO BE SET BEFORE CALLING GENERATE()
    ''' </summary>
    Protected Friend WriteOnly Property KeyLetters() As String
        Set(ByVal Value As String)
            Key_Letters = Value
        End Set
    End Property

    ''' <date>27072005</date><time>071924</time>
    ''' <type>property</type>
    ''' <summary>
    ''' WRITE ONLY PROPERTY. HAS TO BE SET BEFORE CALLING GENERATE()
    ''' </summary>
    Protected Friend WriteOnly Property KeyNumbers() As String
        Set(ByVal Value As String)
            Key_Numbers = Value
        End Set
    End Property

    ''' <date>27072005</date><time>071924</time>
    ''' <type>property</type>
    ''' <summary>
    ''' WRITE ONLY PROPERTY. HAS TO BE SET BEFORE CALLING GENERATE()
    ''' </summary>
    Protected Friend WriteOnly Property KeyChars() As Integer
        Set(ByVal Value As Integer)
            Key_Chars = Value
        End Set
    End Property

    ''' <date>27072005</date><time>072344</time>
    ''' <type>function</type>
    ''' <summary>
    ''' GENERATES A RANDOM STRING OF LETTERS AND NUMBERS.
    ''' LETTERS CAN BE RANDOMLY CAPITAL OR SMALL.
    ''' </summary>
    ''' <returns type="String">RETURNS THE
    '''         RANDOMLY GENERATED KEY</returns>
    Function Generate() As String
        Dim i_key As Integer
        Dim Random1 As Single
        Dim arrIndex As Int16
        Dim sb As New StringBuilder
        Dim RandomLetter As String

        ''' CONVERT LettersArray & NumbersArray TO CHARACTR ARRAYS
        LettersArray = Key_Letters.ToCharArray
        NumbersArray = Key_Numbers.ToCharArray

        For i_key = 1 To Key_Chars
            ''' START THE CLOCK    - LAITH - 27/07/2005 18:01:18 -
            Randomize()
            Random1 = Rnd()
            arrIndex = -1
            ''' IF THE VALUE IS AN EVEN NUMBER WE GENERATE A LETTER,
            ''' OTHERWISE WE GENERATE A NUMBER  
            '''          - LAITH - 27/07/2005 18:02:55 -
            ''' THE NUMBER '111' WAS RANDOMLY CHOSEN. ANY NUMBER
            ''' WILL DO, WE JUST NEED TO BRING THE VALUE
            ''' ABOVE '0'     - LAITH - 27/07/2005 18:40:48 -
            If (CType(Random1 * 111, Integer)) Mod 2 = 0 Then
                ''' GENERATE A RANDOM INDEX IN THE LETTERS
                ''' CHARACTER ARRAY   - LAITH - 27/07/2005 18:47:44 -
                Do While arrIndex < 0
                    arrIndex = _
                     Convert.ToInt16(LettersArray.GetUpperBound(0) _
                     * Random1)
                Loop
                RandomLetter = LettersArray(arrIndex)
                ''' CREATE ANOTHER RANDOM NUMBER. IF IT IS ODD,
                ''' WE CAPITALIZE THE LETTER
                '''      - LAITH - 27/07/2005 18:55:59 -
                If (CType(arrIndex * Random1 * 99, Integer)) Mod 2 <> 0 Then
                    RandomLetter = LettersArray(arrIndex).ToString
                    RandomLetter = RandomLetter.ToUpper
                End If
                sb.Append(RandomLetter)
            Else
                ''' GENERATE A RANDOM INDEX IN THE NUMBERS
                ''' CHARACTER ARRAY   - LAITH - 27/07/2005 18:47:44 -
                Do While arrIndex < 0
                    arrIndex = _
                      Convert.ToInt16(NumbersArray.GetUpperBound(0) _
                      * Random1)
                Loop
                sb.Append(NumbersArray(arrIndex))
            End If
        Next
        Return sb.ToString
    End Function
End Class
© . All rights reserved.