Generáljon véletlenszerű alfanumerikus karakterláncot Kotlinban

1. Áttekintés

Ebben az oktatóanyagban megvitatjuk, hogyan lehet véletlenszerű alfanumerikusat létrehozni Húr három különböző megközelítést alkalmazva: Java Véletlen, Kotlin Véletlenés Apache Commons Lang RandomStringUtils.

Ezután áttekintjük a nagy teljesítményű megközelítést.

2. Függőségek

Mielőtt belevetnénk magunkat az oktatóanyagba, tegyük bele az Apache Commons Lang függőséget pom.xml:

 org.apache.commons commons-lang3 3.8.1 

Ezenkívül beállíthatunk néhány konstansot későbbi hivatkozás céljából:

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

3. Java Véletlen

Először is nézzük meg, hogyan kell használd a Java-t Véletlen véletlenszerű generálására Húr.

Ebben a példában a következőket fogjuk használni ThreadLocalRandom amelynek van egy Véletlen szálanként példány és védelem a viták ellen:

private val charPool: List = ('a' .. 'z') + ('A' .. 'Z') + ('0' .. '9') @Teszt móka adottAStringLength_whenUsingJava_thenReturnAlphanumericString () {val randomString = ThreadLocalRandom. current () .ints (STRING_LENGTH.toLong (), 0, charPool.size) .asSequence () .map (charPool :: get) .joinToString ("") állítás (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

Ebben a példában mi vagyunk 10 véletlenszerű alfanumerikus karakter megszerzése a karakterkészletből indexeik létrehozásával, majd csatlakozzon hozzájuk a véletlenszerű létrehozásához Húr.

ThreadLocalRandom JDK 7 óta elérhető. Használhatnánk java.util.Random helyette. De ha több szál ugyanazt a példányt használja Véletlen, ugyanazt a magot több szál osztja meg, ami szálversenyt okoz.

Azonban, se ThreadLocalRandom sem Véletlen kriptográfiailag biztonságosak, mivel kitalálható a generátor által visszaadott következő érték. A Java valóban észrevehetően lassabb java.security.SecureRandom véletlenszerű érték biztonságos előállításához.

4. Kotlin Véletlen

Kotlin 1.3-tól, kotlin.random.Random többplatformos szolgáltatásként érhető el. Használja java.util.Random a JDK 6-ban és 7-ben, ThreadLocalRandom a JDK 8+ és Math.random Javascriptben.

Szerezhetünk véletlenszerűt Húr ugyanezzel a megközelítéssel:

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

5. Apache Common Lang

Végül, ha továbbra is a Kotlint használjuk, megtehetjük használja az Apache Common Lang könyvtárakat egy véletlenszerű generáláshoz Húr:

@Test fun givenAStringLength_whenUsingApacheCommon_thenReturnAlphanumericString () {val randomString = RandomStringUtils.randomAlphanumeric (STRING_LENGTH); állítás (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

Ebben a példában egyszerűen hívunk RandomStringUtils.randomAlphanumeric hogy megszerezzük a mi Húr előre meghatározott hosszúsággal.

Meg kell jegyeznünk RandomStringUtils segítségével véletlenszerű értékeket generálhat java.util.Random, ami a kriptográfia szempontjából nem biztonságos, amint azt fentebb tárgyaltuk. Tehát egy biztonságos token vagy érték előállítása esetén használhatjuk CryptoRandom az Apache Commons Crypto vagy Java-ban SecureRandom.

Van egy bemutatónk arról, hogyan lehet véletlenszerűen generálni Húr Java-ban is, hogy ezt a témát részletesebben tárgyalja.

6. Teljesítmény

Ezek mindegyikének figyelemre méltó aspektusa, hogy hívja a véletlenszám-generátorunkat STRING_LENGTH alkalommal. Ha sokakat hozunk létre Húrok vagy hosszú Húrok, ezek a megközelítések túl lassúak lehetnek. Némi extra erőfeszítéssel azonban egyszerűen felhívhatunk egy véletlenszerű bájtsorrendet, majd feltérképezhetjük őket a char poolba:

@Test fun givenAStringLength_whenUsingRandomForBytes_thenReturnAlphanumericString () {val random = SecureRandom () val bytes = ByteArray (STRING_LENGTH) random.nextBytes (bytes) val randomString = (0..bytes.xt - i). (charPool.size)]} .joinToString ("") állítás (randomString.matches (Regex (ALPHANUMERIC_REGEX))) assertEquals (STRING_LENGTH, randomString.length)} 

Erőssé teszi ezt a megközelítést, miközben még mindig csináljuk STRING_LENGTH keresések a mi charPool, csak egyszer hívjuk meg véletlen generátorunkat. És amellett, hogy gyorsabb, ez csökkentheti a megosztott példányok szálversenyét is.

7. Következtetés

Összegzésként elmondható, hogy három megközelítésen ment keresztül egy véletlenszerű alfanumerikus karakterlánc előállítása Kotlinban, amelyek mindegyikének árnyalatait feltártuk. Ezután sebességváltást hajtottunk végre, hogy megvizsgáljuk a Kotlin és a Java API-k számára újratervezhető nagy teljesítményű megoldást.

Mint mindig, a kód megtalálható a GitHubon.