Hasilkan String Alfanumerik Acak di Kotlin

1. Ikhtisar

Dalam tutorial ini, kita akan membahas cara membuat String alfanumerik acak di Kotlin menggunakan tiga pendekatan berbeda: Java Random , Kotlin Random , dan Apache Commons Lang RandomStringUtils .

Kemudian, kita akan mengakhiri dengan melihat pendekatan kinerja tinggi.

2. Dependensi

Sebelum kita menyelami tutorial, mari tambahkan ketergantungan Apache Commons Lang ke pom.xml kita :

 org.apache.commons commons-lang3 3.8.1 

Selain itu, kita dapat menyiapkan beberapa konstanta untuk referensi nanti:

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

3. Acak Jawa

Pertama-tama, mari kita lihat bagaimana menggunakan Java Random untuk menghasilkan String acak .

Dalam contoh ini, kami akan menggunakan ThreadLocalRandom yang memiliki instance Acak per utas dan melindungi dari pertengkaran:

private 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); }

Dalam contoh ini, kami mendapatkan 10 karakter alfanumerik acak dari kumpulan karakter dengan membuat indeksnya, lalu menggabungkannya untuk membuat String acak .

ThreadLocalRandom tersedia sejak JDK 7 . Kita bisa menggunakan java.util.Random sebagai gantinya. Tetapi jika beberapa utas menggunakan contoh Acak yang sama, benih yang sama dibagikan oleh beberapa utas, menyebabkan pertentangan utas.

Namun, baik ThreadLocalRandom maupun Random tidak aman secara kriptografis , karena dimungkinkan untuk menebak nilai berikutnya yang dikembalikan dari generator. Java memang menyediakan java.security.SecureRandom yang terasa lebih lambat untuk menghasilkan nilai acak dengan aman.

4. Kotlin Acak

Dari Kotlin 1.3, kotlin.random.Random tersedia sebagai fitur multiplatform. Ini menggunakan java.util.Random di JDK 6 dan 7, ThreadLocalRandom di JDK 8+ dan Math.random di Javascript.

Kita bisa mendapatkan String acak dengan pendekatan yang sama:

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

5. Apache Common Lang

Terakhir, jika kita masih menggunakan Kotlin, kita dapat menggunakan pustaka Apache Common Lang untuk menghasilkan String acak :

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

Dalam contoh ini, kami cukup memanggil RandomStringUtils.randomAlphanumeric untuk mendapatkan String kami dengan panjang yang telah ditentukan.

Kita harus mencatat bahwa RandomStringUtils menghasilkan nilai acak dengan menggunakan java.util.Random , yang tidak aman secara kriptografis seperti yang kita bahas di atas. Jadi dalam hal menghasilkan token atau nilai yang aman, kita dapat menggunakan CryptoRandom di Apache Commons Crypto atau SecureRandom Java .

Kami memiliki tutorial tentang cara membuat String acak di Java juga untuk membahas topik ini secara lebih rinci.

6. Kinerja

Aspek penting dari masing-masing ini adalah bahwa ia memanggil pembuat nomor acak kami STRING_LENGTH kali. Jika kita membuat banyak String atau String panjang , pendekatan ini mungkin terlalu lambat. Namun, dengan upaya ekstra, kita cukup memanggil urutan byte acak, lalu memetakannya ke kumpulan karakter kita:

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

Apa yang membuat pendekatan ini kuat adalah bahwa, sementara kami masih melakukan pencarian STRING_LENGTH ke charPool kami , kami hanya memanggil generator acak kami sekali. Dan, selain lebih cepat, ini juga dapat mengurangi pertentangan utas pada instance bersama.

7. Kesimpulan

Sebagai kesimpulan, kami telah melalui tiga pendekatan untuk menghasilkan string alfanumerik acak di Kotlin, mengeksplorasi nuansa masing-masing. Kemudian, kami beralih gigi untuk memeriksa solusi berperforma tinggi yang dapat digunakan kembali untuk API Kotlin dan Java.

Seperti biasa, kode dapat ditemukan di GitHub.