Wie generiert man einen zufälligen String in Java, ohne verrückt zu werden?
\n\nStellen 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.
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\nMachen Sie IntelliJ IDEA bereit. Los geht's!
\n\n1. Der einfachste (aber langsamste) Weg: UUID
\n\nBeginnen 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.
public static String generateWithUUID() {\n return UUID.randomUUID().toString().replace("-", "");\n}\n\n\nVorteile: Eine Zeile Code. Kein Nachdenken nötig.
\nNachteile: 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.
2. RandomStringUtils aus Apache Commons Lang
\n\nEin Klassiker, der von Projekt zu Projekt wandert. Die Bibliothek commons-lang3 bietet eine fertige Methode:
import org.apache.commons.lang3.RandomStringUtils;\n\npublic static String generateWithCommons(int length) {\n return RandomStringUtils.randomAlphanumeric(length);\n}\n\n\nSchön? Ja. Leistungsstark? Nicht wirklich.
\nUnter 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.
3. Benutzerdefinierte Methode mit Random.nextInt()
\n\nLassen Sie uns unser eigenes Rad bauen. Der naheliegendste Weg:
\n\nimport 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\nWas ist hier wichtig?
\n- \n
- Wir verwenden
StringBuildermit bekannter Kapazität – keine unnötigen Erweiterungen. \n SecureRandomstellt 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
Es gibt jedoch ein Problem: SecureRandom kann unter Linux langsam sein (Warten auf Entropie). Wenn Geschwindigkeit wichtiger als Sicherheit ist, verwenden Sie ThreadLocalRandom.current().
4. Optimierung mit char[] und ThreadLocalRandom
\n\nWollen Sie das Maximum herausholen? Verzichten Sie auf StringBuilder und arbeiten Sie direkt mit einem Zeichen-Array:
import java.util.concurrent.ThreadLocalR