1975 Stimmen

Wie man eine zufällige alphanumerische Zeichenfolge erzeugt

Ich habe nach einem einfach Java-Algorithmus zur Erzeugung einer pseudo-zufälligen alphanumerischen Zeichenkette. In meinem Fall würde sie als eindeutiger Sitzungs-/Schlüsselbezeichner verwendet, der "wahrscheinlich" in folgenden Fällen eindeutig ist 500K+ Generation (meine Bedürfnisse erfordern nicht wirklich etwas viel Anspruchsvolleres).

Im Idealfall könnte ich eine Länge angeben, die meinen Bedürfnissen nach Einzigartigkeit entspricht. Eine generierte Zeichenkette der Länge 12 könnte zum Beispiel wie folgt aussehen "AEYGF7K0DM1X" .

166 Stimmen

64 Stimmen

Selbst wenn man das Geburtstagsparadoxon in Betracht zieht, bräuchte man bei Verwendung von 12 alphanumerischen Zeichen (62 insgesamt) immer noch weit über 34 Milliarden Zeichenfolgen, um das Paradoxon zu erreichen. Und das Geburtstagsparadoxon garantiert sowieso keine Kollision, es sagt nur, dass die Wahrscheinlichkeit über 50 % liegt.

6 Stimmen

@NullUserException 50 % Erfolgschance (pro Versuch) ist verdammt hoch: Selbst bei 10 Versuchen liegt die Erfolgsquote bei 0,999. Wenn man das und die Tatsache bedenkt, dass man innerhalb von 24 Stunden VIELE Versuche machen kann, braucht man keine 34 Milliarden Zeichenfolgen, um ziemlich sicher zu sein, dass man mindestens eine davon errät. Das ist der Grund, warum einige Sitzungs-Tokens sehr, sehr lang sein sollten.

6voto

michaelok Punkte 1114

Sie erwähnen "einfach", aber nur für den Fall, dass jemand nach etwas sucht, das strengere Sicherheitsanforderungen erfüllt, sollten Sie sich vielleicht folgende Seiten ansehen jpwgen . jpwgen ist modelliert nach pwgen in Unix, und ist sehr konfigurierbar.

0 Stimmen

Danke, ich habe es korrigiert. Es gibt also zumindest eine Quelle und der Link ist gültig. Der Nachteil ist, dass es nicht so aussieht, als ob es seit einer Weile aktualisiert wurde, obwohl ich sehe, dass pwgen vor kurzem aktualisiert wurde.

6voto

Suganya Punkte 11
import java.util.*;
import javax.swing.*;

public class alphanumeric {
    public static void main(String args[]) {
        String nval, lenval;
        int n, len;

        nval = JOptionPane.showInputDialog("Enter number of codes you require: ");
        n = Integer.parseInt(nval);

        lenval = JOptionPane.showInputDialog("Enter code length you require: ");
        len = Integer.parseInt(lenval);

        find(n, len);
    }

    public static void find(int n, int length) {
        String str1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        StringBuilder sb = new StringBuilder(length);
        Random r = new Random();

        System.out.println("\n\t Unique codes are \n\n");
        for(int i=0; i<n; i++) {
            for(int j=0; j<length; j++) {
                sb.append(str1.charAt(r.nextInt(str1.length())));
            }
            System.out.println("  " + sb.toString());
            sb.delete(0, length);
        }
    }
}

5voto

user_3380739 Punkte 1495

Hier ist der Einzeiler von AbacusUtil :

String.valueOf(CharStream.random('0', 'z').filter(c -> N.isLetterOrDigit(c)).limit(12).toArray())

Zufällig bedeutet nicht, dass es einzigartig sein muss. Um eindeutige Zeichenfolgen zu erhalten, verwenden Sie:

N.uuid() // E.g.: "e812e749-cf4c-4959-8ee1-57829a69a80f". length is 36.
N.guid() // E.g.: "0678ce04e18945559ba82ddeccaabfcd". length is 32 without '-'

4voto

Prasobh.Kollattu Punkte 1511

Sie können den folgenden Code verwenden, wenn Ihr Passwort zwingend Zahlen und alphabetische Sonderzeichen enthält:

private static final String NUMBERS = "0123456789";
private static final String UPPER_ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz";
private static final String SPECIALCHARACTERS = "@#$%&*";
private static final int MINLENGTHOFPASSWORD = 8;

public static String getRandomPassword() {
    StringBuilder password = new StringBuilder();
    int j = 0;
    for (int i = 0; i < MINLENGTHOFPASSWORD; i++) {
        password.append(getRandomPasswordCharacters(j));
        j++;
        if (j == 3) {
            j = 0;
        }
    }
    return password.toString();
}

private static String getRandomPasswordCharacters(int pos) {
    Random randomNum = new Random();
    StringBuilder randomChar = new StringBuilder();
    switch (pos) {
        case 0:
            randomChar.append(NUMBERS.charAt(randomNum.nextInt(NUMBERS.length() - 1)));
            break;
        case 1:
            randomChar.append(UPPER_ALPHABETS.charAt(randomNum.nextInt(UPPER_ALPHABETS.length() - 1)));
            break;
        case 2:
            randomChar.append(SPECIALCHARACTERS.charAt(randomNum.nextInt(SPECIALCHARACTERS.length() - 1)));
            break;
        case 3:
            randomChar.append(LOWER_ALPHABETS.charAt(randomNum.nextInt(LOWER_ALPHABETS.length() - 1)));
            break;
    }
    return randomChar.toString();
}

4voto

neuhaus Punkte 1

Sie können die UUID-Klasse mit ihrer getLeastSignificantBits()-Nachricht verwenden, um 64 Bit von zufällig Daten und konvertieren sie dann in eine Radix-36-Zahl (d. h. eine aus 0-9,A-Z bestehende Zeichenkette):

Long.toString(Math.abs( UUID.randomUUID().getLeastSignificantBits(), 36));

Daraus ergibt sich ein String bis zu 13 Zeichen lang. Wir verwenden Math.abs(), um sicherzustellen, dass sich kein Minuszeichen eingeschlichen hat.

3 Stimmen

Warum in aller Welt sollten Sie UUID verwenden, um zufällige Bits zu erhalten? Warum verwenden Sie nicht einfach random.nextLong() ? Oder sogar Double.doubleToLongBits(Math.random()) ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X