SerialKeyGenerator mit Array und Random erstellen.

  • Ich möchte gerne einen KeyGen machen und habe mir dazu folgendes überlegt:

    [autoit]


    $GenC = ""
    Global $arr1[37] = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
    For $arrF = 1 to 4 Step 1
    For $arrM = 1 to 4 Step 1
    $rdm = Random(1, 37, 1)
    $GenC = $GenC + $arr1[$rdm]
    Next
    $GenC = $GenC + "-"
    Next
    MsgBox(0, "Output", $GenC)

    [/autoit]

    Aber es gibt mir immer nur eine zahl aus die bei Wiederhohlung erhöht wird...

    Es sollte jedoch so etwas ausgeben wie:
    WGOC-4FLO-I9GK-QJF6

    Weiß jemand den Fehler?
    Danke im Voraus
    Toby

  • Du bist hier im falschen Unterforum ^^
    Das nächste mal poste bitte Probleme in https://autoit.de/index.php/Boar…rst%C3%BCtzung/

    1. Arrays beginnen bei dem Index 0. Entweder setzt du hinter Zeile 6 noch ein -1 oder lässt die Random() Funktion eine Zahl von 0 bis 36 generieren.

    2. Der + Operator ist für Strings unzulässig. Normalerweise bekommst du bei der "Addition" von zwei Zeichen eine 0 zurück. Wenn jedoch zufällig eine Zahl als Zeichen erwischt wird, wandelt AutoIt dieses automatisch in ein Integer um. Deswegen bekommst du nicht die Anzahl der Wiederholungen zurück, sondern irgend eine wilde Nummer. Verwende stattdessen den & Operator.

    • Offizieller Beitrag

    [verschoben nach H&U]

    Zum erstellen von Seriennummern hatte ich mal vor langer Zeit ein Script geschrieben, das außerdem gleich verhindert, dass doppelte Nummern generiert werden.

    Spoiler anzeigen
    [autoit]


    #include <Crypt.au3>
    $iTimer = TimerInit()
    _GenSerials(10000, @ScriptDir & '\_Nummern.txt', @ScriptDir & '\_MD5Checksummen.txt')
    If @error Then MsgBox(0, 'Fehler aufgetreten!', 'Fehlernummer: ' & @error)
    ConsoleWrite(TimerDiff($iTimer) & @CR)

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    ======================================================================================================================
    Function Name: _GenSerials($iCount, $sSerialFile, $sMD5File)
    Description: Seriennummern nach folgendem Muster "AAAA-BBBB-CCCC-DDDD-EEEE" generieren (keine Doppelten)
    Parameter(s): $iCount = Anzahl der Seriennummern
    $sSerialFile = Datei, in der die Seriennummern gespeichert werden
    $sMD5File = Datei, in der die MD5-Hashwerte gespeichert werden
    Author(s): Oscar (http://www.autoit.de)
    ======================================================================================================================
    #ce
    Func _GenSerials($iCount, $sSerialFile, $sMD5File)
    If $iCount < 1 Or Not IsNumber($iCount) Then Return SetError(1, 0, 0)
    Local $hFile1 = FileOpen($sSerialFile, 2)
    Local $hFile2 = FileOpen($sMD5File, 2)
    Local $sChars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' ; I und 1 sowie O und 0 weggelassen, wegen Verwechslungsgefahr
    Local $iCharCount = StringLen($sChars)
    Local $oDictionary = ObjCreate('Scripting.Dictionary') ; zum Vergleich auf Doppelte (ist viel schneller als StringInStr)
    If $hFile1 <> -1 And $hFile2 <> -1 Then
    Local $sSerialOut = '', $sMD5Out = '', $iTimer = TimerInit()
    For $i = 1 To $iCount
    If TimerDiff($iTimer) > 250 Then
    $iTimer = TimerInit()
    ToolTip('Generiere Seriennummer: ' & $i, @DesktopWidth/2-100, 0)
    EndIf
    Do
    Local $sTmp = ''
    For $j = 1 To 20
    $sTmp &= StringMid($sChars, Random(1, $iCharCount, 1), 1)
    If $j/4 = Int($j/4) And $j < 20 Then $sTmp &= '-'
    Next
    Until Not $oDictionary.Exists($sTmp)
    $oDictionary.Add($sTmp, 0)
    $sSerialOut &= $sTmp & @CRLF
    $sMD5Out &= _Crypt_HashData($sTmp, $CALG_MD5) & @CRLF
    Next
    FileWrite($hFile1, StringTrimRight($sSerialOut, 2))
    FileClose($hFile1)
    FileWrite($hFile2, StringTrimRight($sMD5Out, 2))
    FileClose($hFile2)
    Return 1
    Else
    Return SetError(2, 0, 0)
    EndIf
    EndFunc

    [/autoit]