צור מחרוזת אלפאנומרית אקראית בקוטלין

1. סקירה כללית

במדריך זה נדון כיצד ליצור אלפא-נומרי אקראי חוּט בקוטלין תוך שימוש בשלוש גישות שונות: Java אַקרַאִי, קוטלין אַקרַאִי, ו- Apache Commons Lang RandomStringUtils.

לאחר מכן, נסכם במבט על גישה עם ביצועים גבוהים.

2. תלות

לפני שנצלול לתוך ההדרכה, בואו נוסיף את התלות של Apache Commons Lang pom.xml:

 org.apache.commons commons-lang3 3.8.1 

בנוסף, אנו יכולים להגדיר כמה קבועים לעיון מאוחר יותר:

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

3. ג'אווה אַקרַאִי

קודם כל, בואו נסתכל איך השתמש ב- Java אַקרַאִי כדי ליצור אקראי חוּט.

בדוגמה זו נשתמש ThreadLocalRandom שיש לו אַקרַאִי מופע לפי שרשור ומגן מפני טענות:

private val charPool: List = ('a' .. 'z') + ('A' .. 'Z') + ('0' .. '9') @Test fun givenAStringLength_whenUsingJava_thenReturnAlphanumericString () {val randomString = ThreadLocalRandom. הנוכחי () .ints (STRING_LENGTH.toLong (), 0, charPool.size) .asSequence () .map (charPool :: get) .joinToString ("") assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

בדוגמה זו אנו קבלת 10 תווים אלפאנומריים אקראיים ממאגר התווים על ידי יצירת האינדקסים שלהם, ואז חבר אותם יחד כדי ליצור את האקראי חוּט.

ThreadLocalRandom זמין מאז JDK 7. נוכל להשתמש java.util.Random במקום זאת. אבל אם מספר אשכולות משתמשים באותו מופע של אַקרַאִי, אותו זרע משותף למספר חוטים, מה שגורם למחלוקת חוטים.

למרות זאת, לא זה ולא זה ThreadLocalRandom ולא אַקרַאִי מאובטחים באופן קריפטוגרפי, מכיוון שאפשר לנחש את הערך הבא שיוחזר מהגנרטור. ג'אווה אכן מספקת את האיטי בעליל java.security.SecureRandom כדי ליצור באופן מאובטח ערך אקראי.

4. קוטלין אַקרַאִי

מקוטלין 1.3, kotlin.random. אקראי זמין כתכונה מרובת צורות. זה משתמש java.util.Random ב- JDK 6 ו- 7, ThreadLocalRandom ב- JDK 8+ ו- מתמטיקה. אקראי ב- Javascript.

אנחנו יכולים לקבל אקראי חוּט באותה גישה:

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

5. אפאצ'י נפוץ לאנג

לבסוף, אם אנחנו עדיין משתמשים בקוטלין, אנחנו יכולים השתמש בספריות Apache Common Lang כדי ליצור אקראי חוּט:

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

בדוגמה זו, אנו פשוט קוראים RandomStringUtils.randomAlphanumeric להשיג את שלנו חוּט עם אורך מוגדר מראש.

עלינו לציין זאת RandomStringUtils ליצור ערכים אקראיים באמצעות java.util.Random, שאינו מאובטח באופן קריפטוגרפי כפי שדנו למעלה. כך שבמקרה של יצירת אסימון או ערך מאובטח, נוכל להשתמש בו CryptoRandom ב- Crypto Apache Commons או Java SecureRandom.

יש לנו הדרכה כיצד ליצור אקראי חוּט גם בג'אווה כדי לכסות נושא זה בפרטים נוספים.

6. ביצועים

היבט בולט של כל אחד מאלה הוא שהוא קורא למחולל המספרים האקראיים שלנו אורך המחרוזת פִּי. אם אנו יוצרים רבים מיתרים או ארוך מיתרים, הגישות הללו עשויות להיות איטיות מדי. עם קצת מאמץ נוסף, אנו יכולים פשוט לקרוא לרצף אקראי של בתים, ואז למפות אותם למאגר החרמים שלנו:

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

מה שהופך את הגישה הזו לעוצמתית זה, בזמן שאנחנו עדיין עושים אורך המחרוזת חיפושים אחר שלנו charPoolאנו קוראים לגנרטור האקראי שלנו רק פעם אחת. וחוץ מלהיות מהיר יותר, זה עשוי גם להפחית את מחלוקת החוט במקרים משותפים.

7. מסקנה

לסיכום, עברנו שלוש גישות ליצירת מחרוזת אלפאנומרית אקראית בקוטלין, ובחנו את הניואנסים של כל אחת מהן. לאחר מכן העברנו הילוך כדי לבחון פתרון בעל ביצועים גבוהים שניתן להחזיר לממשקי ה- API של Kotlin ו- Java.

כמו תמיד, ניתן למצוא את הקוד ב- GitHub.


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