Generierung von Zufallsstrings in Java: Vom Chaos zur Leistung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie generiert man einen zufälligen String in Java, ohne verrückt zu werden?

\n\n

Stellen Sie sich vor: Sie programmieren eine Registrierung auf einer Website. Sie müssen ein eindeutiges Token zur E-Mail-Bestätigung erstellen. Oder ein Passwort für einen neuen Benutzer generieren. Oder einfach eine lesbare ID für einen Link erzeugen. Das Erste, was einem in den Sinn kommt, ist UUID.randomUUID(), die Bindestriche zu entfernen und sich des Lebens zu freuen.

\n\n

Stopp. Wissen Sie, dass eine scheinbar einfache Aktion zu einem Engpass in der Leistung werden kann? Die Frage auf Stack Overflow "How to generate a random alpha-numeric string" hat nicht umsonst tausende Aufrufe gesammelt. Der Teufel steckt, wie immer, im Detail: die Wahl des Zufallszahlengenerators, der Algorithmus, die Speicherverwaltung. In diesem Artikel schreiben wir nicht einfach nur Code – wir optimieren ihn bis zum Maximum.

\n\n

Machen Sie IntelliJ IDEA bereit. Los geht's!

\n\n

1. Der einfachste (aber langsamste) Weg: UUID

\n\n

Beginnen wir mit dem Klassiker. UUID generiert einen 128-Bit-Wert. Wenn man die Bindestriche entfernt, erhält man 32 Zeichen im Hex-Format (0-9, a-f). Das ist bereits ein alphanumerischer String, jedoch mit einem eingeschränkten Alphabet.

\n\n
public static String generateWithUUID() {\n    return UUID.randomUUID().toString().replace("-", "");\n}\n
\n\n

Vorteile: Eine Zeile Code. Kein Nachdenken nötig.

\n

Nachteile: Die Länge kann nicht kontrolliert werden. Nur Hex-Zeichen (16 Zeichen im Alphabet). Für Passwörter zu schwach. Für Tokens akzeptabel, aber es gibt einen Haken.

\n\n

Übrigens verwendet UUID.randomUUID() unter der Haube SecureRandom. Das ist kryptografisch sicher, aber langsam. Wenn Sie 10.000 Strings pro Sekunde benötigen, wird diese Methode Sie enttäuschen.

\n\n

2. RandomStringUtils aus Apache Commons Lang

\n\n

Ein Klassiker, der von Projekt zu Projekt wandert. Die Bibliothek commons-lang3 bietet eine fertige Methode:

\n\n
import org.apache.commons.lang3.RandomStringUtils;\n\npublic static String generateWithCommons(int length) {\n    return RandomStringUtils.randomAlphanumeric(length);\n}\n
\n\n

Schön? Ja. Leistungsstark? Nicht wirklich.

\n

Unter der Haube verwendet RandomStringUtils java.util.Random (nicht kryptografisch sicher) und erzeugt viele temporäre Objekte. Für die meisten Aufgaben reicht es, aber wenn Sie Millionen von Strings generieren, bereiten Sie sich auf GC-Pausen vor.

\n\n

3. Benutzerdefinierte Methode mit Random.nextInt()

\n\n

Lassen Sie uns unser eigenes Rad bauen. Der naheliegendste Weg:

\n\n
import java.security.SecureRandom;\nimport java.util.Random;\n\npublic class RandomStringGenerator {\n    private static final String ALPHANUMERIC = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";\n    private static final int BASE = ALPHANUMERIC.length();\n    private final Random random;\n\n    public RandomStringGenerator() {\n        this.random = new SecureRandom(); // für kryptografische Sicherheit\n    }\n\n    public String generate(int length) {\n        StringBuilder sb = new StringBuilder(length);\n        for (int i = 0; i < length; i++) {\n            sb.append(ALPHANUMERIC.charAt(random.nextInt(BASE)));\n        }\n        return sb.toString();\n    }\n}\n
\n\n

Was ist hier wichtig?

\n
    \n
  • Wir verwenden StringBuilder mit bekannter Kapazität – keine unnötigen Erweiterungen.
  • \n
  • SecureRandom stellt sicher, dass die Ausgabe nicht vorhersagbar ist. Für Tokens ein Muss.
  • \n
  • Das Alphabet ist als String definiert – 62 Zeichen (26+26+10). Sonderzeichen können hinzugefügt werden.
  • \n
\n\n

Es gibt jedoch ein Problem: SecureRandom kann unter Linux langsam sein (Warten auf Entropie). Wenn Geschwindigkeit wichtiger als Sicherheit ist, verwenden Sie ThreadLocalRandom.current().

\n\n

4. Optimierung mit char[] und ThreadLocalRandom

\n\n

Wollen Sie das Maximum herausholen? Verzichten Sie auf StringBuilder und arbeiten Sie direkt mit einem Zeichen-Array:

\n\n
import java.util.concurrent.ThreadLocalR                

Blogs

Buchempfehlungen