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






4.56/5 (19投票s)
2005年7月28日
2分钟阅读

189147

3682
一个稍微更智能的随机字符串生成器。
引言
我需要创建一个代码片段,来生成一组随机生成的密钥。每个密钥必须由字母和数字组成,并且字母可以是小写或大写(随机)。
在网上查看了一些示例代码后,我找不到我需要的东西。我找到的所有示例要么只生成数字,要么只生成字母。我还希望这个随机密钥基于某种规则,使其“不是直接的”随机,因此,我编写了这个小代码片段。
使用代码
它的工作方式如下:
你提供一个字母字符串: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