Generer en tilfeldig alfanumerisk streng i Kotlin

1. Oversikt

I denne opplæringen vil vi diskutere hvordan du genererer en tilfeldig alfanumerisk String i Kotlin ved hjelp av tre forskjellige tilnærminger: Java Tilfeldig, Kotlin Tilfeldigog Apache Commons Lang RandomStringUtils.

Deretter vil vi avslutte med en titt på en høyytelsesmetode.

2. Avhengigheter

Før vi dykker ned i opplæringen, la oss legge til Apache Commons Lang avhengighet i vår pom.xml:

 org.apache.commons commons-lang3 3.8.1 

I tillegg kan vi sette opp noen konstanter for senere referanse:

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

3. Java Tilfeldig

La oss først se på hvordan bruk Java Tilfeldig å generere et tilfeldig String.

I dette eksemplet bruker vi ThreadLocalRandom som har en Tilfeldig forekomst per tråd og beskytter mot strid:

private val charPool: List = ('a' .. 'z') + ('A' .. 'Z') + ('0' .. '9') @Test fun givenAStringLength_whenUsingJava_thenReturnAlphanumericString () {val randomString = ThreadLocalRandom. gjeldende () .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 eksemplet er vi få 10 tilfeldige alfanumeriske tegn fra tegnfeltet ved å generere indeksene, bli med dem sammen for å skape tilfeldig String.

ThreadLocalRandom er tilgjengelig siden JDK 7. Vi kan bruke java.util.Random i stedet. Men hvis flere tråder bruker samme forekomst av Tilfeldig, det samme frøet deles av flere tråder, og forårsaker strid i tråden.

Derimot, ingen ThreadLocalRandom heller ikke Tilfeldig er kryptografisk sikre, da det er mulig å gjette neste verdi som returneres fra generatoren. Java gir merkbart tregere java.security.SecureRandom for å generere en tilfeldig verdi på en sikker måte.

4. Kotlin Tilfeldig

Fra Kotlin 1.3, kotlin.random.Random er tilgjengelig som en multiplatform-funksjon. Det bruker java.util.Random i JDK 6 og 7, ThreadLocalRandom i JDK 8+ og Matematikk. Tilfeldig i Javascript.

Vi kan få en tilfeldig String med samme tilnærming:

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

5. Apache Common Lang

Til slutt, hvis vi fortsatt bruker Kotlin, kan vi bruk Apache Common Lang-biblioteker for å generere et tilfeldig String:

@Test fun givenAStringLength_whenUsingApacheCommon_thenReturnAlphanumericString () {val randomString = RandomStringUtils.randomAlphanumeric (STRING_LENGTH); assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

I dette eksemplet kaller vi bare RandomStringUtils.randomAlphanumeric å få vår String med en forhåndsdefinert lengde.

Vi bør merke oss det RandomStringUtils generere tilfeldige verdier ved hjelp av java.util.Random, som ikke er kryptografisk sikker som vi diskuterte ovenfor. Så hvis vi genererer et sikret token eller verdi, kan vi bruke CryptoRandom i Apache Commons Crypto eller Java SecureRandom.

Vi har en veiledning om hvordan du genererer en tilfeldig String også i Java for å dekke dette emnet i flere detaljer.

6. Ytelse

Et bemerkelsesverdig aspekt av hver av disse er at den kaller vår tilfeldige tallgenerator STRING_LENGTH ganger. Hvis vi skaper mange Strenger eller lang Strenger, disse tilnærmingene kan være for sakte. Med litt ekstra anstrengelse kan vi imidlertid bare be om en tilfeldig bytesekvens, og deretter kartlegge dem til char-bassenget vårt:

@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)} 

Det som gjør denne tilnærmingen kraftig er at mens vi fortsatt gjør det STRING_LENGTH oppslag til vår charPool, vi anløper bare den tilfeldige generatoren vår en gang. Og, bortsett fra å være raskere, kan dette også redusere trådstridighet på delte forekomster.

7. Konklusjon

Avslutningsvis har vi gått gjennom tre tilnærminger for å generere en tilfeldig alfanumerisk streng i Kotlin, og utforske nyansene til hver. Deretter skiftet vi gir for å undersøke en høyytelsesløsning som kan brukes for Kotlin og Java APIer.

Som alltid kan koden bli funnet på GitHub.


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