Genereer een willekeurige alfanumerieke reeks in Kotlin

1. Overzicht

In deze zelfstudie bespreken we hoe u een willekeurige alfanumeriek kunt genereren Draad in Kotlin met behulp van drie verschillende benaderingen: Java Willekeurig, Kotlin Willekeurig, en Apache Commons Lang RandomStringUtils.

Daarna sluiten we af met een blik op een krachtige aanpak.

2. Afhankelijkheden

Voordat we in de tutorial duiken, laten we de Apache Commons Lang-afhankelijkheid toevoegen aan onze pom.xml:

 org.apache.commons commons-lang3 3.8.1 

Daarnaast kunnen we enkele constanten instellen voor latere referentie:

const val STRING_LENGTH = 10; const val ALPHANUMERIC_REGEX = "[a-zA-Z0-9] +"; 

3. Java Willekeurig

Laten we eerst eens kijken hoe gebruik Java Willekeurig om een ​​willekeurig Draad.

In dit voorbeeld gebruiken we ThreadLocalRandom die een Willekeurig instantie per thread en beveiligingen tegen twist:

private val charPool: List = ('a' .. 'z') + ('A' .. 'Z') + ('0' .. '9') @Test plezier gegevenAStringLength_whenUsingJava_thenReturnAlphanumericString () {val randomString = ThreadLocalRandom. current () .ints (STRING_LENGTH.toLong (), 0, charPool.size) .asSequence () .map (charPool :: get) .joinToString ("") assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

In dit voorbeeld zijn we 10 willekeurige alfanumerieke tekens uit de tekenpool halen door hun indexen te genereren, voeg ze dan samen om het willekeurige te creëren Draad.

ThreadLocalRandom is beschikbaar sinds JDK 7. We kunnen gebruiken java.util.Random in plaats daarvan. Maar als meerdere threads dezelfde instantie van Willekeurig, hetzelfde seed wordt gedeeld door meerdere threads, waardoor thread-conflicten ontstaan.

Echter, geen van beide ThreadLocalRandom noch Willekeurig zijn cryptografisch veilig, omdat het mogelijk is om de volgende waarde te raden die door de generator wordt geretourneerd. Java biedt het merkbaar langzamere java.security.SecureRandom om veilig een willekeurige waarde te genereren.

4. Kotlin Willekeurig

Vanaf Kotlin 1.3, kotlin.random.Random is beschikbaar als een functie voor meerdere platforms. Het gebruikt java.util.Random in JDK 6 en 7, ThreadLocalRandom in JDK 8+ en Math.willekeurig in Javascript.

We kunnen een willekeurige krijgen Draad met dezelfde aanpak:

val randomString = (1..STRING_LENGTH) .map {i -> kotlin.random.Random.nextInt (0, charPool.size)} .map (charPool :: get) .joinToString ("");

5. Apache Common Lang

Eindelijk, als we Kotlin nog steeds gebruiken, kunnen we dat gebruik maken van Apache Common Lang-bibliotheken om een ​​willekeurig Draad:

@Test plezier gegevenAStringLength_whenUsingApacheCommon_thenReturnAlphanumericString () {val randomString = RandomStringUtils.randomAlphanumeric (STRING_LENGTH); beweren (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

In dit voorbeeld bellen we gewoon RandomStringUtils.randomAlphanumeric om onze te krijgen Draad met een voorgedefinieerde lengte.

Dat moeten we opmerken RandomStringUtils genereer willekeurige waarden met java.util.Random, wat niet cryptografisch veilig is, zoals we hierboven hebben besproken. Dus in het geval van het genereren van een beveiligd token of waarde, kunnen we CryptoRandom in Apache Commons Crypto of Java's SecureRandom.

We hebben een tutorial over het genereren van een random Draad ook in Java om dit onderwerp in meer details te behandelen.

6. Prestaties

Een opmerkelijk aspect van elk van deze is dat het onze generator voor willekeurige getallen aanroept DRAADLENGTE keer. Als we er veel creëren Snaren of lang Snaren, deze benaderingen zijn mogelijk te traag. Met wat extra moeite kunnen we eenvoudig een willekeurige reeks bytes oproepen en deze vervolgens toewijzen aan onze charpool:

@Test plezier gegevenAStringLength_whenUsingRandomForBytes_thenReturnAlphanumericString () {val random = SecureRandom () val bytes = ByteArray (STRING_LENGTH) random.nextBytes (bytes) val randomString = (0..bytes.size [randomSnext {->. (charPool.size)]} .joinToString ("") assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))) assertEquals (STRING_LENGTH, randomString.length)} 

Wat deze aanpak krachtig maakt, is dat, terwijl we dat nog doen DRAADLENGTE lookups naar onze charPool, we doen maar één keer een beroep op onze toevalsgenerator. En, afgezien van het feit dat het sneller is, kan dit ook de discussie tussen threads over gedeelde instanties verminderen.

7. Conclusie

Tot slot hebben we drie benaderingen doorlopen om een ​​willekeurige alfanumerieke reeks in Kotlin te genereren, waarbij we de nuances van elk hebben onderzocht. Vervolgens hebben we een versnelling hoger geschakeld om een ​​hoogwaardige oplossing te onderzoeken die kan worden hergebruikt voor de Kotlin- en Java-API's.

Zoals altijd is de code te vinden op GitHub.