Generirajte slučajni alfanumerički niz u Kotlinu

1. Pregled

U ovom uputstvu razgovarat ćemo o generiranju slučajnih alfanumeričkih znakova Niz u Kotlinu koristeći tri različita pristupa: Java Slučajno, Kotlin Slučajnoi Apache Commons Lang RandomStringUtils.

Zatim ćemo završiti s pogledom na pristup visokih performansi.

2. Ovisnosti

Prije nego što uđemo u tutorial, dodajmo ovisnost Apache Commons Lang u našu pom.xml:

 org.apache.commons commons-lang3 3.8.1 

Osim toga, možemo postaviti neke konstante za kasniju referencu:

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

3. Java Slučajno

Prije svega, pogledajmo kako koristiti Javu Slučajno za generiranje slučajnog Niz.

U ovom ćemo primjeru koristiti ThreadLocalRandom koja ima a Slučajno instanca po niti i mjere zaštite od prijepora:

privatni val charPool: List = ('a' .. 'z') + ('A' .. 'Z') + ('0' .. '9') @Test fun givenAStringLength_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); }

U ovom primjeru smo dobivanje 10 slučajnih alfanumeričkih znakova iz spremišta znakova generiranjem njihovih indeksa, zatim ih spojite da biste stvorili slučajne Niz.

ThreadLocalRandom dostupan je od JDK 7. Mogli bismo koristiti java.util.Slučajno umjesto toga. Ali ako više niti koristi istu instancu Slučajno, isto sjeme dijeli više niti, što dovodi do neslaganja s nitima.

Međutim, ni ThreadLocalRandom ni Slučajno su kriptografski sigurni, jer je moguće pogoditi sljedeću vrijednost vraćenu iz generatora. Java pruža osjetno sporije java.security.SecureRandom za sigurno generiranje slučajne vrijednosti.

4. Kotlin Slučajno

Iz Kotlina 1.3, kotlin.random.Slučajno dostupan je kao značajka više platformi. Koristi java.util.Slučajno u JDK 6 i 7, ThreadLocalRandom u JDK 8+ i Matematika. random u Javascriptu.

Možemo dobiti slučajno Niz s istim pristupom:

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

5. Apache Common Lang

Napokon, ako i dalje koristimo Kotlin, možemo iskoristite Apache Common Lang knjižnice za generiranje slučajnog Niz:

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

U ovom primjeru jednostavno zovemo RandomStringUtils.randomAlfanumerički da bi dobili naše Niz s unaprijed definiranom duljinom.

To bismo trebali primijetiti RandomStringUtils generirati slučajne vrijednosti pomoću java.util.Slučajno, koji nije kriptografski siguran kao što smo gore raspravljali. Dakle, u slučaju generiranja osiguranog tokena ili vrijednosti, možemo koristiti CryptoRandom u Apache Commons Crypto ili Java SecureRandom.

Imamo vodič o tome kako generirati slučajni slučaj Niz u Javi, kako bi se ova tema detaljnije obradila.

6. Izvedba

Značajni aspekt svake od njih je da poziva naš generator slučajnih brojeva STRING_LENGTH puta. Ako ih stvaramo mnogo Žice ili dugo Žice, ovi pristupi mogu biti prespori. Uz malo dodatnog napora, možemo jednostavno pozvati slučajni slijed bajtova, a zatim ih preslikati u naš char char:

@Test zabave givenAStringLength_whenUsingRandomForBytes_thenReturnAlphanumericString () {val random = SecureRandom () val bytes = ByteArray (STRING_LENGTH) random.nextBytes (bytes) val randomString = (0..bytes.sip - i.bajt.sip - i. (charPool.size)]} .joinToString ("") potvrditi (randomString.matches (Regex (ALPHANUMERIC_REGEX))) assertEquals (STRING_LENGTH, randomString.length)} 

Ono što ovaj pristup čini moćnim jest da, dok to još uvijek činimo STRING_LENGTH pretraživanja za naše charPool, samo jednom se pozivamo na naš slučajni generator. I osim što je brže, to također može smanjiti prepirku u nitima na dijeljenim instancama.

7. Zaključak

U zaključku smo prošli tri pristupa za generiranje slučajnog alfanumeričkog niza u Kotlinu, istražujući nijanse svakog od njih. Zatim smo promijenili brzinu kako bismo ispitali rješenje visokih performansi koje se može prenamijeniti za API-je Kotlin i Java.

Kao i uvijek, kod se može pronaći na GitHub-u.


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