Generer en tilfældig alfanumerisk streng i Kotlin

1. Oversigt

I denne vejledning diskuterer vi, hvordan man genererer en tilfældig alfanumerisk Snor i Kotlin ved hjælp af tre forskellige tilgange: Java Tilfældig, Kotlin Tilfældigog Apache Commons Lang RandomStringUtils.

Derefter afslutter vi et kig på en højtydende tilgang.

2. Afhængigheder

Før vi dykker ned i vejledningen, lad os tilføje Apache Commons Lang afhængighed i vores pom.xml:

 org.apache.commons commons-lang3 3.8.1 

Derudover kan vi oprette nogle konstanter til senere reference:

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

3. Java Tilfældig

Lad os først se på, hvordan man gør det brug Java Tilfældig at generere en tilfældig Snor.

I dette eksempel bruger vi ThreadLocalRandom som har en Tilfældig forekomst pr. tråd og beskytter mod strid:

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

I dette eksempel er vi få 10 tilfældige alfanumeriske tegn fra tegnpuljen ved at generere deres indekser, slut derefter dem sammen for at skabe tilfældigt Snor.

ThreadLocalRandom er tilgængelig siden JDK 7. Vi kunne bruge java.util. tilfældighed i stedet. Men hvis flere tråde bruger den samme forekomst af Tilfældig, det samme frø deles af flere tråde, hvilket forårsager trådstrid.

Imidlertid, ingen af ​​dem ThreadLocalRandom heller ikke Tilfældig er kryptografisk sikre, da det er muligt at gætte den næste værdi, der returneres fra generatoren. Java giver det mærkbart langsommere java.security.SecureRandom for sikkert at generere en tilfældig værdi.

4. Kotlin Tilfældig

Fra Kotlin 1.3, kotlin.random.Random er tilgængelig som en multiplatform-funktion. Det bruger java.util. tilfældighed i JDK 6 og 7, ThreadLocalRandom i JDK 8+ og Matematik. Tilfældig i Javascript.

Vi kan få en tilfældig Snor med samme tilgang:

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

5. Apache Common Lang

Endelig, hvis vi stadig bruger Kotlin, kan vi benyt Apache Common Lang-biblioteker til at generere en tilfældig Snor:

@Test sjov givetAStringLength_whenUsingApacheCommon_thenReturnAlphanumericString () {val randomString = RandomStringUtils.randomAlphanumeric (STRING_LENGTH); hævde (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

I dette eksempel kalder vi simpelthen RandomStringUtils.randomAlphanumeric at få vores Snor med en foruddefineret længde.

Det skal vi bemærke RandomStringUtils generere tilfældige værdier ved hjælp af java.util. tilfældighed, som ikke er kryptografisk sikker som vi diskuterede ovenfor. Så i tilfælde af generering af et sikret token eller værdi kan vi bruge CryptoRandom i Apache Commons Crypto eller Java SecureRandom.

Vi har en tutorial om, hvordan man genererer en tilfældig Snor også i Java for at dække dette emne i flere detaljer.

6. Ydeevne

Et bemærkelsesværdigt aspekt af hver af disse er, at det kalder vores tilfældige talgenerator STRING_LENGTH gange. Hvis vi skaber mange Strenge eller lang Strenge, disse tilgange kan være for langsomme. Med lidt ekstra indsats kan vi dog bare kalde på en tilfældig rækkefølge af bytes og derefter kortlægge dem til vores char-pool:

@Test fun givenAStringLength_whenUsingRandomForBytes_thenReturnAlphanumericString () {val random = SecureRandom () val bytes = ByteArray (STRING_LENGTH) random.nextBytes (bytes) val randomString = (0..bytes.størrelse - 1). (charPool.size)]} .joinToString ("") assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))) assertEquals (STRING_LENGTH, randomString.length)} 

Hvad gør denne tilgang stærk er, mens vi stadig gør det STRING_LENGTH opslag til vores charPool, vi kalder kun på vores tilfældige generator en gang. Og bortset fra at være hurtigere, kan dette også reducere trådstridigheder i delte tilfælde.

7. Konklusion

Afslutningsvis har vi gennemgået tre tilgange til at generere en tilfældig alfanumerisk streng i Kotlin, der udforsker nuancerne for hver. Derefter skiftede vi gear for at undersøge en højtydende løsning, der kan genanvendes til Kotlin og Java API'er.

Som altid kan koden findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found