تولید کننده رمز و عبارت تصادفی — راهنمای کاربردی
در این مطلب، روش ساخت تولید کننده رمز و عبارت تصادفی در زبانهای برنامهنویسی «پایتون» (Python Programming Language) و «جاوا» (Java) آموزش داده شده است. برای مطالعه بیشتر پیرامون اعداد تصادفی، مطالب زیر توصیه میشوند.
- اعداد تصادفی (Random Numbers) — تاریخچه و کاربردها
- تولید اعداد تصادفی در پایتون — به زبان ساده
- ماژول Random در پایتون چیست؟ – نحوه استفاده به زبان ساده
- تولید عدد تصادفی با یک تاس شش وجهی — به زبان ساده
تولید کننده رمز و عبارت تصادفی در جاوا
در ادامه، چگونگی تولید رمز و عبارت تصادفی در جاوا آموزش داده شده است. ابتدا، کد تولید رمز تصادفی با استفاده از کتابخانههای استاندارد جاوا و سپس، با کتابخانه «آپاچی کامانز لنگ» (Apache Commons Lang library)، ارائه شده است.
تولید کننده رمز تصادفی بدون محدودیت در جاوا
ابتدا، کار با حالت سادهای آغاز میشود که طی آن، یک رشته تصادفی محدود به ۷ کاراکتر تولید میشود.
1@Test
2public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() {
3 byte[] array = new byte[7]; // length is bounded by 7
4 new Random().nextBytes(array);
5 String generatedString = new String(array, Charset.forName("UTF-8"));
6
7 System.out.println(generatedString);
نباید فراموش کرد که رشته جدید، یک رشته حرفی عددی خواهد بود.
تولید رمز تصادفی دارای محدودیت در جاوا
اکنون، چگونگی ساخت یک رشته محدودتر مورد بررسی قرار میگیرد. مثلا، رشتهای که در آن از حروف انگلیسی کوچک استفاده شده باشد.
همچنین، طول رشته نیز از پیش تعیین میشود.
1@Test
2public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() {
3
4 int leftLimit = 97; // letter 'a'
5 int rightLimit = 122; // letter 'z'
6 int targetStringLength = 10;
7 Random random = new Random();
8 StringBuilder buffer = new StringBuilder(targetStringLength);
9 for (int i = 0; i < targetStringLength; i++) {
10 int randomLimitedInt = leftLimit + (int)
11 (random.nextFloat() * (rightLimit - leftLimit + 1));
12 buffer.append((char) randomLimitedInt);
13 }
14 String generatedString = buffer.toString();
15
16 System.out.println(generatedString);
17}
تولید رشته تصادفی محدود با Apache Commons Lang
کتابخانه کامانز لنگ از آپاچی (Apache Commons Lang)، به کاربر کمک زیادی در ساخت تولید کننده رمز و عبارت تصادفی میکند.
در ادامه، روش تولید رشته تصادفی صرفا با استفاده از حروف (محدودیت)، مورد بررسی قرار میگیرد.
1@Test
2public void givenUsingApache_whenGeneratingRandomStringBounded_thenCorrect() {
3
4 int length = 10;
5 boolean useLetters = true;
6 boolean useNumbers = false;
7 String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);
8
9 System.out.println(generatedString);
10}
بنابراین، به جای همه کدهای سطح پایین موجود در کد جاوا که در بخش پیش ارائه شد، با خطوط کد کمتر و سادهتری میتوان به نتیجه مورد نظر رسید.
تولید رشته تصادفی الفبایی با Apache Commons Lang
در ادامه، مثال بسیار ساده دیگری از این کتابخانه، این بار برای یک رشته محدود که صرفا با کاراکترهای الفبایی و بدون استفاده از پرچمهای بولین ساخته شده، آموزش داده شده است.
1@Test
2public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() {
3 String generatedString = RandomStringUtils.randomAlphabetic(10);
4
5 System.out.println(generatedString);
6}
تولید رشته حرفیعددی با Apache Commons Lang
و در نهایت، یک رشته محدود شده، از نوع عددی، با استفاده از قطعه کد زیر قابل تولید است.
1@Test
2public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() {
3 String generatedString = RandomStringUtils.randomAlphanumeric(10);
4
5 System.out.println(generatedString);
6}
به طور کلی، میتوان با استفاده از با روشهای پیادهسازی مختلفی در زبان جاوا، تولید کننده رمز و عبارت تصادفی برای تولید رشتههای محدود و غیر محدود ساخت.
تولید کننده رمز و عبارت تصادفی در پایتون
در پایتون میتوان یک رشته تصادفی را با استفاده از ماژول رندوم ساخت. گاهی، کاربر نیاز دارد که از رمز و عبارت تصادفی (رشته تصادفی) به عنوان شناساگرهای واحد، شناسه جلسه (Session Id) یا رمز عبور، استفاده کند.
در ادامه، روش ساخت تولید کننده رمز و عبارت تصادفی در پایتون آموزش داده شده است.
تولید رشته تصادفی با پایتون
در ادامه، از یک تابع مناسب برای تولید رشته تصادفی از یک توالی داده شده از کاراکترها و با یک سایز مشخص، استفاده میشود.
1import random
2import string
3
4def random_string_generator(str_size, allowed_chars):
5 return ''.join(random.choice(allowed_chars) for x in range(str_size))
6
7chars = string.ascii_letters + string.punctuation
8size = 12
9
10print(chars)
11print('Random String of length 12 =', random_string_generator(size, chars))
خروجی قطعه کد بالا به صورت زیر است.
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ Random String of length 12 = 'MP'?EI$MO%w
در اینجا، از تابع random.choice() برای انتخاب یک کاراکتر تصادفی از یک توالی تعیین شده از کاراکترها استفاده میشود. سپس، از حلقه for برای اجرای آن به تعداد دفعات تعیین شده، استفاده میشود. پس از آن، از تابع join() برای الحاق آنها و بازگرداندن رشته تصادفی تولید شده استفاده میشود.
اما اگر کاربر بخواهد اندازه یک رشته تصادفی را متغیر و برای مثال، بین ۸ تا ۱۲ نگه دارد، چه کار باید بکند؟ در ادامه، تابع کمی تغییر داده میشود تا به طور تصادفی، اندازه رشته را انتخاب کند.
1import random
2from random import randint
3import string
4
5def random_string_generator_variable_size(min_size, max_size, allowed_chars):
6 return ''.join(random.choice(allowed_chars) for x in range(randint(min_size, max_size)))
7
8
9chars = string.ascii_letters + string.punctuation
10print('Random String of random length (6-12) =', random_string_generator_variable_size(6, 12, chars))
خروجی قطعه کد بالا به صورت زیر است.
Random String of random length (6-12) = d;@o/?[yq=
این کد نیز تقریبا مشابه تابعی است که در ابتدا ارائه شد؛ با این تفاوت که در اینجا از randint() استفاده شده است. این کار با هدف انتخاب تصادفی اندازه رشتههای تولید شده به صورت تصادفی، انجام میشود.
تولید UUID تصادفی
اگر کاربر بخواهد که یک Unique ID بر مبنای مشخصات فنی RFC-4122 تولید کند، میتواند از ماژول uuid در این راستا استفاده کند.
1import uuid
2
3print('Random UUID from uuid1() =', uuid.uuid1())
4print('Random UUID from uuid4() =', uuid.uuid4())