বড় হাতের অক্ষর এবং অঙ্কগুলি সহ এলোমেলো স্ট্রিং প্রজন্ম


1335

আমি আকারের এন এর স্ট্রিং তৈরি করতে চাই

এটি সংখ্যা এবং বড় হাতের অক্ষরের সমন্বয়ে তৈরি করা উচিত যেমন:

  • 6U1S75
  • 4Z4UKK
  • U911K4

আমি কীভাবে পাইথোনিক উপায়ে এটি অর্জন করতে পারি ?


11
এটি একটি খুব জনপ্রিয় প্রশ্ন। আমি আশা করি কোনও বিশেষজ্ঞ শীর্ষ 3 উত্তরের জন্য এই এলোমেলো সংখ্যার স্বাতন্ত্র্যসূচকতা গ্রহণ করতে চান যেমন স্ট্রিং আকারের পরিসরের সংঘর্ষের সম্ভাবনা, 6 থেকে 16 পর্যন্ত বলুন
ব্যবহারকারী

8
@ বাফার এটি সম্ভব সংমিশ্রনের সংখ্যা গণনা করা সহজ। 10 সংখ্যার + 26 অক্ষর = 36 সম্ভাব্য অক্ষর, 6 এর পাওয়ার (স্ট্রিংয়ের দৈর্ঘ্য) প্রায় দুই বিলিয়ন সমান। এলোমেলো মানগুলির জন্য আমার থাম্বের নিয়মটি হ'ল "যদি আমি পৃথিবীর প্রতিটি মানুষের জন্য মান উত্পন্ন করি তবে তাদের প্রতিটি মান কত হতে পারে?"। এই ক্ষেত্রে যা ব্যক্তি প্রতি এক মানের চেয়ে কম হবে, সুতরাং এটি যদি ব্যবহারকারী বা বস্তু সনাক্ত করতে হয় তবে এটি খুব কম অক্ষর characters একটি বিকল্প হ'ল লোয়ার কেস লেটারগুলিতে যুক্ত করা হবে যা আপনাকে 62 ^ 6 = প্রায় 57 বিলিয়ন অনন্য মূল্যবোধে অবতরণ করে।
Blixt

1
এবং বিশ্বের জনসংখ্যার কথা চিন্তা করা নির্বোধ মনে হতে পারে, এটি কেবল কারণ আপনি সম্ভাব্য সংঘর্ষের জন্য একটি বিশাল বাফার চান। জন্মদিনের সমস্যাটি দেখুন: en.wikedia.org/wiki/ জন্মদিন_প্রব্লেম
Blixt

1
@ বাফার, আপনি তখন এই উত্তরে আগ্রহী হবেন ।
আনিস রামস্বামী

"ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত এলোমেলো স্ট্রিং জেনারেশন ..." নামকরণ করা উচিত নয় ?
smci

উত্তর:


2539

এক লাইনে উত্তর দিন:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

বা পাইথন ৩.6 ব্যবহার করে আরও ছোট করে ব্যবহার করে random.choices():

''.join(random.choices(string.ascii_uppercase + string.digits, k=N))

একটি ক্রিপ্টোগ্রাফিকভাবে আরও সুরক্ষিত সংস্করণ; দেখতে https://stackoverflow.com/a/23728630/2213647 :

''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))

আরও পুনঃব্যবহারের জন্য বিশুদ্ধ ফাংশন সহ বিশদে:

>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
...    return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'

এটা কিভাবে কাজ করে ?

আমরা আমদানি করি string, এমন একটি মডিউল যা সাধারণ ASCII অক্ষরগুলির ক্রম ধারণ করে এবং randomএকটি মডিউল যা এলোমেলো প্রজন্মের সাথে সম্পর্কিত।

string.ascii_uppercase + string.digits কেবলমাত্র বড় হাতের ASCII চরিত্র এবং অঙ্কগুলি উপস্থাপন করে এমন অক্ষরের তালিকার সাথে সম্মতি জানায়:

>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

তারপরে আমরা 'এন' উপাদানগুলির একটি তালিকা তৈরি করতে একটি তালিকা বোঝার ব্যবহার করি:

>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']

উপরের উদাহরণে, আমরা ব্যবহার [তালিকা তৈরি করতে, কিন্তু আমরা নেই না id_generatorফাংশন তাই পাইথন মেমরি তালিকা তৈরি করে না, কিন্তু উড়ে উপাদান, এক এক (এই সম্পর্কে আরো উত্পন্ন এখানে )।

স্ট্রিংটিকে 'এন' বার তৈরি করতে বলার পরিবর্তে elemআমরা পাইথনকে অক্ষরগুলির ক্রম থেকে বেছে নেওয়া একটি এলোমেলো অক্ষর 'এন' বার তৈরি করতে বলব:

>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'

অতএব random.choice(chars) for _ in range(size)সত্যই sizeঅক্ষরের একটি ক্রম তৈরি করা হয় । অক্ষরগুলি যা এলোমেলোভাবে থেকে নেওয়া হয়েছে chars:

>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']

তারপরে আমরা কেবল তাদের সাথে একটি খালি স্ট্রিংয়ের সাথে যোগদান করি যাতে ক্রমটি স্ট্রিংয়ে পরিণত হয়:

>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'

7
@ জোরেলি: এটি কোনও তালিকা উপলব্ধি নয়; এটি একটি জেনারেটর এক্সপ্রেশন।
Ignacio Vazquez-Abram

2
@ জোরিলিলি: আমি উত্তরে এই সম্পর্কে একটি দ্রুত নোট যুক্ত করেছি এবং পুনরাবৃত্তযোগ্য, তালিকা উপলব্ধি, জেনারেটর এবং অবশেষে ফলন কীওয়ার্ড সম্পর্কে আরও বিস্তারিত উত্তরের একটি লিঙ্ক যুক্ত করেছি।
ই-সন্তুষ্ট

1
আমি প্রতিস্থাপন চাই rangeসঙ্গে xrange
ডাঃ জানু-ফিলিপ গেহর্কেকে

1
খুব দরকারী. মজার বিষয় হচ্ছে, জাঙ্গো পাসওয়ার্ড ও সিএসআরএফ টোকেন তৈরির জন্য এই টুকরো কোডটি ব্যবহার করছে। যদিও আপনার randomসাথে প্রতিস্থাপন করা উচিত random.SystemRandom(): github.com/django/django/blob/…
ব্যবহারকারী

1
@ চিয়েল ৯২, random.sampleঅন্য কথায় অক্ষরের পুনরাবৃত্তি করার সম্ভাবনা ছাড়াই প্রতিস্থাপন ছাড়াই নমুনা তৈরি করে , যা ওপি'র প্রয়োজনীয়তার সাথে নয়। আমি মনে করি না এটি বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য কাম্য হবে be
অ্যান্টোলজিস্ট

557

এই স্ট্যাক ওভারফ্লো জিজ্ঞাসাটি "এলোমেলো স্ট্রিং পাইথন" এর জন্য গুগলের বর্তমান শীর্ষ ফলাফল। বর্তমান শীর্ষের উত্তরটি হ'ল:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

এটি একটি দুর্দান্ত পদ্ধতি, তবে এলোমেলোভাবে PRNG ক্রিপ্টোগ্রাফিকভাবে নিরাপদ নয়। আমি ধরে নিই যে এই প্রশ্নটি নিয়ে গবেষণা করা অনেক লোক এনক্রিপশন বা পাসওয়ার্ডের জন্য এলোমেলো স্ট্রিং উত্পন্ন করতে চাইবে। আপনি উপরের কোডটিতে একটি ছোট পরিবর্তন করে নিরাপদে এটি করতে পারেন:

''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))

ব্যবহার random.SystemRandom()শুধু র্যান্ডম ব্যবহারসমূহ, / dev / * স্নো মেশিনে urandom পরিবর্তে এবং CryptGenRandom()উইন্ডোজে। এগুলি ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত PRNGs। কোনও সুরক্ষিত পিআরএনজি প্রয়োজন এমন একটি অ্যাপ্লিকেশনটির random.choiceপরিবর্তে ব্যবহার random.SystemRandom().choiceকরা সম্ভাব্য ধ্বংসাত্মক হতে পারে এবং এই প্রশ্নের জনপ্রিয়তা দেখিয়ে আমি বাজি ধরেছি যে ইতিমধ্যে বহুবার ভুল করা হয়েছে।

আপনি যদি পাইথন ৩..6 বা তার বেশি ব্যবহার করছেন তবে আপনি এমসিফের্টের উত্তরে বর্ণিত নতুন সিক্রেটস মডিউলটি ব্যবহার করতে পারেন :

''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(N))

মডিউল দস্তাবেজগুলি সুরক্ষিত টোকেন এবং সর্বোত্তম অনুশীলনগুলি তৈরি করার সুবিধাজনক উপায়গুলি নিয়েও আলোচনা করে ।


3
হ্যাঁ, এর জন্য সরকারী স্ট্যান্ডার্ড লাইব্রেরি randomএটি সতর্ক করেছে: " সতর্কতা : এই মডিউলটির সিউডো-এলোমেলো জেনারেটরগুলি সুরক্ষা উদ্দেশ্যে ব্যবহার করা উচিত নয় os OS.urandom () বা সিস্টেমর্যান্ডম ব্যবহার করুন যদি আপনার কোনও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত সিউডো-র্যান্ডম নম্বর জেনারেটরের প্রয়োজন হয়। " এখানে রেফ: র্যান্ডম.সিস্টেমর্যান্ডম এবং os.urandom
লর্ড 63। j

4
দুর্দান্ত উত্তর। ছোট নোট: আপনি এটিকে পরিবর্তন করেছেন string.uppercaseযা লোকেল সেটের উপর নির্ভর করে অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারে। ব্যবহার string.ascii_uppercase(বা string.ascii_letters + string.digitsbase36 পরিবর্তে base62 জন্য) ক্ষেত্রে যেখানে এনকোডিং জড়িত মধ্যে নিরাপদ।
Blixt

ছোট নোট - উত্তরটি একটি মেমরির তালিকা তৈরি করে তার xrangeপরিবর্তে ব্যবহার করা ভাল range, যখন প্রাক্তন একটি পুনরুক্তি তৈরি করে।
গেয়ারাড

2
এলোমেলো স্টিং কি সর্বদা অনন্য হবে? আমি একটি প্রাথমিক কী ব্যবহার করতে চেয়েছিলাম
shakthydoss

3
@ শাকথিডোস: না এটি হবে "AAA000", যা একটি র্যান্ডম স্ট্রিং, এবং পরবর্তী "AAA000", যা ফেরত দিতে পারেন এছাড়াও একটি র্যান্ডম স্ট্রিং। স্বতন্ত্রতার জন্য আপনাকে অবশ্যই স্পষ্টভাবে একটি চেক যুক্ত করতে হবে।
usr2564301

189

কেবল পাইথনের বিল্টিন ইউইড ব্যবহার করুন:

যদি ইউইউডিগুলি আপনার উদ্দেশ্যে ঠিক থাকে, তবে বিল্ট ইন ইউইড প্যাকেজটি ব্যবহার করুন ।

এক লাইন সমাধান:

import uuid; uuid.uuid4().hex.upper()[0:6]

গভীরতার সংস্করণে:

উদাহরণ:

import uuid
uuid.uuid4() #uuid4 => full random uuid
# Outputs something like: UUID('0172fc9a-1dac-4414-b88d-6b9a6feb91ea')

আপনার যদি আপনার ফর্ম্যাটটি ঠিক প্রয়োজন (উদাহরণস্বরূপ, "6U1S75"), আপনি এটি এটি করতে পারেন:

import uuid

def my_random_string(string_length=10):
    """Returns a random string of length string_length."""
    random = str(uuid.uuid4()) # Convert UUID format to a Python string.
    random = random.upper() # Make all characters uppercase.
    random = random.replace("-","") # Remove the UUID '-'.
    return random[0:string_length] # Return the random string.

print(my_random_string(6)) # For example, D9E50C

14
প্রশ্নের পিছনে চিন্তা করার জন্য +1। সম্ভবত আপনি uuid1 এবং uuid4 এর মধ্যে পার্থক্যটি সংক্ষেপে ব্যাখ্যা করতে পারেন।
টমাস আহলে

1
আমি যদি টানা তিনবার uuid1 করি তবে আমি পাই: d161fd16-ab0f-11e3-9314-00259073e4a8, d3535b56-ab0f-11e3-9314-00259073e4a8, d413be32-ab0f-11e3-9314-00259073e4 প্রথম 8 টি অক্ষর পৃথক এবং বাকিগুলি একই)। Uuid4 এর ক্ষেত্রে এটি হয় না
চেজ রবার্টস

9
uui1: একটি হোস্ট আইডি, সিকোয়েন্স নম্বর এবং বর্তমান সময় থেকে একটি ইউইউডি তৈরি করুন। uuid4: একটি এলোমেলো ইউইউডি জেনারেট করুন।
বিজন

7
আপনি যদি স্ট্রিং ingালাই এবং হাইফেন প্রতিস্থাপনটি এড়াতে চান তবে আপনি কেবল my_uuid.get_hex () বা uuid.uuid4 ()। Get_hex () কল করতে পারেন এবং এটি হাইউন না থাকা ইউইড থেকে উত্পন্ন একটি স্ট্রিং ফিরিয়ে দেবে।
dshp

8
কোনও ইউইউডি কে ছাঁটাই করা কি ভাল ধারণা? কতটা ছোট string_lengthতা নির্ভর করে সংঘর্ষের সম্ভাবনা উদ্বেগের কারণ হতে পারে।
ব্যবহারকারী

44

একটি সরল, দ্রুত, তবে কিছুটা কম এলোমেলো উপায় হ'ল random.sampleপ্রতিটি বর্ণ আলাদাভাবে বেছে নেওয়ার পরিবর্তে ব্যবহার করা, যদি এন-পুনরাবৃত্তি অনুমোদিত হয়, তবে আপনার এলোমেলো ভিত্তিকে এন টাইম দিয়ে বাড়ান

import random
import string

char_set = string.ascii_uppercase + string.digits
print ''.join(random.sample(char_set*6, 6))

দ্রষ্টব্য: এলোমেলোভাবে। নমুনা চরিত্রের পুনঃব্যবহার রোধ করে, চরিত্রের আকারের গুণকে একাধিক পুনরাবৃত্তি সম্ভব করে তোলে, তবে এগুলি এখনও নিখুঁত এলোমেলো পছন্দে হওয়ার সম্ভাবনা কম। যদি আমরা 6 দৈর্ঘ্যের স্ট্রিংয়ের জন্য যাই, এবং আমরা 'এক্স'টিকে প্রথম অক্ষর হিসাবে বেছে নিই, উদাহরণস্বরূপ, দ্বিতীয় অক্ষরের জন্য' এক্স 'পাওয়ার অভ্যাসটি' এক্স 'পাওয়ার মতভেদ হিসাবে একই প্রথম চরিত্র। র্যান্ডম.সাম্পল বাস্তবায়নে, পরবর্তী কোনও চরিত্র হিসাবে 'এক্স' পাওয়ার প্রতিকূলতা কেবল প্রথম চরিত্র হিসাবে পাওয়ার সম্ভাবনা কেবল 6/7


8
এই উপায়টি খারাপ নয় তবে এটি প্রতিটি চরিত্রকে পৃথকভাবে নির্বাচন করার মতো এলোমেলো নয়, কারণ sampleএকই অক্ষরটি আপনি কখনও দুবার তালিকাভুক্ত পাবেন না। অবশ্যই এটি এর Nচেয়েও বেশি ব্যর্থ হবে 36
বোবিনস

প্রদত্ত ব্যবহারের ক্ষেত্রে (যদি কোনও পুনরাবৃত্তি ঠিক না থাকে) আমি বলব এটি এখনও সর্বোত্তম সমাধান।
অনুরাগ ইউনিয়াল

3
উদাহরণগুলির মধ্যে একটিটির পুনরাবৃত্তি রয়েছে, তাই আমি সন্দেহ করি যে তিনি পুনরাবৃত্তিগুলি বর্জন করতে চাইছেন।
মার্ক বাইয়ার্স

5
যদি এলোমেলোভাবে নমুনা অক্ষর পুনরায় ব্যবহার প্রতিরোধ করে, চরিত্রের আকারের গুণকে একাধিক পুনরাবৃত্তি সম্ভব করে তোলে , তবে এগুলি এখনও কম সম্ভাবনা থাকে তবে তারা খাঁটি এলোমেলো পছন্দ হয়। যদি আমরা 6 দৈর্ঘ্যের স্ট্রিংয়ের জন্য যাই, এবং আমরা 'এক্স'টিকে প্রথম অক্ষর হিসাবে বেছে নিই, উদাহরণস্বরূপ, দ্বিতীয় অক্ষরের জন্য' এক্স 'পাওয়ার অভ্যাসটি' এক্স 'পাওয়ার মতভেদ হিসাবে একই প্রথম চরিত্র। র্যান্ডম.সাম্পল বাস্তবায়নে, পরবর্তী কোনও চরিত্র হিসাবে 'এক্স' পাওয়ার প্রতিকূলতা কেবল প্রথম চরিত্র হিসাবে পাওয়ার সম্ভাবনা কেবল 5/6।
pcurry

1
উত্পন্ন স্ট্রিংয়ের মধ্য দিয়ে যাওয়ার সাথে সাথে কোনও নির্দিষ্ট চরিত্রের পুনরাবৃত্তি হবার সম্ভাবনা কমে যায়। 26 টি বড় অক্ষর এবং 10 অঙ্কের 6 টি অক্ষরের একটি স্ট্রিং উত্পন্ন করে এলোমেলোভাবে প্রতিটি অক্ষর স্বাধীনভাবে বেছে নেওয়া, কোনও নির্দিষ্ট স্ট্রিং ফ্রিকোয়েন্সি 1 / (36 ^ 6) সহ ঘটে। 'FU3WYE' এবং 'XXXXXX' উত্পন্ন করার সুযোগটি একই। নমুনা বাস্তবায়নে, 'এক্সএক্সএক্সএক্সএক্সএক্সএক্স' উত্পন্ন করার সুযোগটি (1 / (36 ^ 6)) * ((6/6) * (5/6) * (4/6) * (3/6) * (2 /)) * (১/6)) এলোমেলো বৈশিষ্ট্যের কারণে.অনুষ্ঠানের। 'এক্সএক্সএক্সএক্সএক্সএক্সএক্স' নমুনা বাস্তবায়নে 324 গুণ কম সম্ভাব্য।
পিচুরি

32
import uuid
lowercase_str = uuid.uuid4().hex  

lowercase_str মত একটি এলোমেলো মান 'cea8b32e00934aaea8c005a35d85a5c0'

uppercase_str = lowercase_str.upper()

uppercase_str হয় 'CEA8B32E00934AAEA8C005A35D85A5C0'


2
uppercase_str[:N+1]
ইয়াজো 12'16

@ যাজো হ্যাঁ আমরা কাটা ব্যবহার সীমাবদ্ধ করতে পারি
সাওয়াদ কেপি

2
@ ইয়াজো: না, আপনি হেক্স মানটি স্লাইস করতে চান না। আপনি বড় হাতের অক্ষর এবং অঙ্কগুলির সম্পূর্ণ ক্রমের তুলনায় এনট্রপি সরিয়ে ফেলেন। পরিবর্তে মান 3232-এনকোড পরিবর্তে (সামান্য হ্রাস এন্ট্রপি, 36 ** এন থেকে 32 ** এন, এখনও 16 ** এন এর চেয়ে ভাল)।
মার্টিজন পিটারস

19

এটি করার একটি দ্রুত, সহজ এবং আরও নমনীয় উপায় হ'ল strgenমডিউলটি ( pip install StringGenerator) ব্যবহার করা ।

বড় হাতের অক্ষর এবং অঙ্কগুলি সহ একটি 6-বর্ণের এলোমেলো স্ট্রিং উত্পন্ন করুন:

>>> from strgen import StringGenerator as SG
>>> SG("[\u\d]{6}").render()
u'YZI2CI'

একটি অনন্য তালিকা পান:

>>> SG("[\l\d]{10}").render_list(5,unique=True)
[u'xqqtmi1pOk', u'zmkWdUr63O', u'PGaGcPHrX2', u'6RZiUbkk2i', u'j9eIeeWgEF']

স্ট্রিংয়ের একটি "বিশেষ" চরিত্রের গ্যারান্টি দিন :

>>> SG("[\l\d]{10}&[\p]").render()
u'jaYI0bcPG*0'

একটি এলোমেলো এইচটিএমএল রঙ:

>>> SG("#[\h]{6}").render()
u'#CEdFCa'

প্রভৃতি

আমাদের সচেতন হওয়া দরকার যে এটি:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

এটিতে কোনও অঙ্ক (বা বড় হাতের অক্ষর) নাও থাকতে পারে।

strgenউপরের সমাধানগুলির তুলনায় বিকাশকারী সময়ে দ্রুত। Ignacio থেকে সমাধানটি দ্রুততম রান-টাইম পারফরম্যান্স এবং পাইথন স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করে সঠিক উত্তর। তবে আপনি কখনই এটিকে ফর্মটিতে ব্যবহার করবেন না। আপনি সিস্টেমআরডম (বা উপলভ্য না হলে ফ্যালব্যাক) ব্যবহার করতে চান, প্রয়োজনীয় অক্ষর সেটগুলি উপস্থাপিত হয়েছে কিনা তা নিশ্চিত করুন, ইউনিকোড ব্যবহার করুন (বা না), ক্রমাগত আমন্ত্রণগুলি একটি অনন্য স্ট্রিং তৈরি করেছে তা নিশ্চিত করুন, স্ট্রিং মডিউল চরিত্র শ্রেণীর একটির একটি উপসেট ব্যবহার করুন, ইত্যাদির জন্য সরবরাহকৃত উত্তরের চেয়ে অনেক বেশি কোডের প্রয়োজন। একটি সমাধানকে সাধারণীকরণের বিভিন্ন প্রয়াসের সমস্ত সীমাবদ্ধতা রয়েছে যা একটি সাধারণ টেমপ্লেট ভাষা ব্যবহার করে বৃহত্তর ব্রেভিটি এবং এক্সপ্রেসিভ শক্তি দিয়ে সমাধান করে।

এটি পিপিআইতে রয়েছে:

pip install StringGenerator

প্রকাশ: আমি স্টারজেন মডিউলটির লেখক।


12

পাইথন ৩.6 থেকে আপনার secretsমডিউলটি ব্যবহার করা উচিত যদি আপনার মডিউলের পরিবর্তে ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত হওয়া প্রয়োজনrandom (অন্যথায় এই উত্তরটি @ ইগনাসিও ওয়াজকেজ-আব্রামগুলির একটির মতো):

from secrets import choice
import string

''.join([choice(string.ascii_uppercase + string.digits) for _ in range(N)])

একটি অতিরিক্ত নোট: str.joinএকটি জেনারেটর এক্সপ্রেশন ব্যবহারের চেয়ে একটি তালিকা-উপলব্ধি দ্রুততর হয় !


10

অন্য স্ট্যাক ওভারফ্লো উত্তরের উপর ভিত্তি করে, একটি এলোমেলো স্ট্রিং এবং এলোমেলো হেক্সাডেসিমেল সংখ্যা তৈরির সর্বাধিক হালকা উপায় , গৃহীত উত্তরের চেয়ে ভাল সংস্করণ হবে:

('%06x' % random.randrange(16**6)).upper()

অনেক দ্রুত.


1
এটি দুর্দান্ত, যদিও এটি কেবল 'এএফ' ব্যবহার করবে এবং 'এ-জেড' নয়। এছাড়াও, প্যারামিট্রাইজ করার সময় কোডটি কিছুটা কম সুন্দর হয় N
টমাস আহলে

9

যদি আপনার ছদ্ম এলোমেলো স্ট্যান্ডের পরিবর্তে এলোমেলো স্ট্রিং দরকার os.urandomহয় তবে আপনার উত্স হিসাবে ব্যবহার করা উচিত

from os import urandom
from itertools import islice, imap, repeat
import string

def rand_string(length=5):
    chars = set(string.ascii_uppercase + string.digits)
    char_gen = (c for c in imap(urandom, repeat(1)) if c in chars)
    return ''.join(islice(char_gen, None, length))

3
os.urandomসিউডো এলোমেলোভাবে কীভাবে হয় না? এটি সম্ভবত আরও এলোমেলো সংখ্যাগুলি তৈরি করতে আরও ভাল অ্যালগরিদম ব্যবহার করছে তবে এটি এখনও ছদ্ম র্যান্ডম।
Tyilo

@ টিইলো, আমি /dev/randomএবং এর মধ্যে পার্থক্য সম্পর্কে সচেতন /dev/urandom। সমস্যাটি হ'ল /dev/randomযখন পর্যাপ্ত এনট্রপি থাকে না যা এটির কার্যকারিতা সীমিত করে। একটি জন্য এক সময় প্যাড /dev/urandom যথেষ্ট নয়, কিন্তু আমি মনে করি এটা ছদ্ম র্যান্ডম এখানে চেয়ে ভালো।
জন লা রুয়

1
আমি বলব যে উভয় /dev/randomএবং /dev/urandomসিউডো এলোমেলো, তবে এটি আপনার সংজ্ঞার উপর নির্ভর করে।
টাইলো

9

আমি ভেবেছিলাম এখনও কেউ এই উত্তর দেয় নি LOL! তবে ওহে, এখানে আমার নিজের যেতে হবে:

import random

def random_alphanumeric(limit):
    #ascii alphabet of all alphanumerals
    r = (range(48, 58) + range(65, 91) + range(97, 123))
    random.shuffle(r)
    return reduce(lambda i, s: i + chr(s), r[:random.randint(0, len(r))], "")

4
আমি এটিকে ভোট দেবো না, তবে আমি মনে করি এত সহজ কাজের জন্য এটি খুব জটিল। প্রত্যাবর্তনের অভিব্যক্তিটি একটি দানব। সহজ জটিল চেয়ে ভাল।
কার্ল স্মিথ

12
@ কার্লস্মিথ, সত্য আমার সমাধানটি কাজের জন্য কিছুটা ওভারকিল বলে মনে হচ্ছে, তবে আমি অন্যান্য সহজ সমাধানগুলি সম্পর্কে অবগত ছিলাম, এবং কেবল একটি ভাল উত্তরের বিকল্প পথ খুঁজতে চাইতাম ished স্বাধীনতা ছাড়া সৃজনশীলতা বিপদে রয়েছে, এভাবে আমি এগিয়ে গিয়ে পোস্ট করেছি posted
nemesisfixx

7

এই পদ্ধতিটি এলোমেলো.চয়েস () পদ্ধতি ইগনাসিও পোস্ট করার চেয়ে কিছুটা দ্রুত এবং কিছুটা বিরক্তিকর।

এটি সিউডো-র্যান্ডম অ্যালগরিদমগুলির প্রকৃতি এবং বিটওয়াসা এবং ব্যাঙ্কগুলি প্রতিটি চরিত্রের জন্য একটি নতুন এলোমেলো সংখ্যা তৈরির চেয়ে দ্রুততর স্থান গ্রহণ করে।

# must be length 32 -- 5 bits -- the question didn't specify using the full set
# of uppercase letters ;)
_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'

def generate_with_randbits(size=32):
    def chop(x):
        while x:
            yield x & 31
            x = x >> 5
    return  ''.join(_ALPHABET[x] for x in chop(random.getrandbits(size * 5))).ljust(size, 'A')

... এমন একটি জেনারেটর তৈরি করুন যা একবারে 0..31 এ 5 বিট সংখ্যা বের করে না ফেলে যতক্ষণ না কোনটি না ফেলে

... যোগদান করুন () ডান বিট সহ একটি এলোমেলো সংখ্যায় জেনারেটরের ফলাফল

টাইমিট সহ, 32-চরিত্রের স্ট্রিংয়ের জন্য সময়টি ছিল:

[('generate_with_random_choice', 28.92901611328125),
 ('generate_with_randbits', 20.0293550491333)]

... তবে character৪ টি চরিত্রের জন্য, খরগোশ হারিয়ে যায়;)

আমি যদি সত্যিই আমার সহকর্মীদের অপছন্দ না করি তবে আমি সম্ভবত উত্পাদন কোডে এই পদ্ধতির ব্যবহার করব না।

সম্পাদনা: প্রশ্নের অনুসারে আপডেট হয়েছে (কেবলমাত্র বড় এবং বড় সংখ্যা) এবং বিটওয়াইড অপারেটর এবং এবং >>% এবং // এর পরিবর্তে ব্যবহার করুন


5

আমি এটি এইভাবে করব:

import random
from string import digits, ascii_uppercase

legals = digits + ascii_uppercase

def rand_string(length, char_set=legals):

    output = ''
    for _ in range(length): output += random.choice(char_set)
    return output

বা শুধু:

def rand_string(length, char_set=legals):

    return ''.join( random.choice(char_set) for _ in range(length) )

5

নম্পির র্যান্ডম.চয়েস () ফাংশনটি ব্যবহার করুন

import numpy as np
import string        

if __name__ == '__main__':
    length = 16
    a = np.random.choice(list(string.ascii_uppercase + string.digits), length)                
    print(''.join(a))

ডকুমেন্টেশন এখানে http://docs.scipy.org/doc/numpy-1.10.0/references/generated/numpy.random.choice.html


1
পাইথন স্ট্যাডলিব এলোমেলো পরিবর্তে কেন আমি ন্যাপি র্যান্ডম ব্যবহার করব?
Pax0r

কারণ এটি দৈর্ঘ্য, পরিবর্তনশীল সম্ভাবনা এবং প্রতিস্থাপনের সাথে নির্বাচনের মতো যুক্তিগুলিতে আরও বিকল্পের অনুমতি দেয়।
মুদিত জৈন

5

কখনও কখনও 0 (শূন্য) এবং ও (চিঠি ও) বিভ্রান্ত হতে পারে। সুতরাং আমি ব্যবহার

import uuid
uuid.uuid4().hex[:6].upper().replace('0','X').replace('O','Y')

4
>>> import string 
>>> import random

নিম্নলিখিত যুক্তিটি এখনও 6 টি চরিত্রের এলোমেলো নমুনা উত্পন্ন করে

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits),6))
JT7K3Q

6 দিয়ে গুণ করার দরকার নেই

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits)*6,6))

TK82HK

3
তবে এই রূপটি সমস্ত চরিত্রকে আলাদা হতে বাধ্য করবে। এন লেনের চেয়ে বড় হলে এটি কাজ করবে না (স্ট্রিং.এএসসিআই_উপকারকেস + স্ট্রিং.ডিজিটস)
মারসফট

3

আপনারা যারা কার্যকরী অজগর উপভোগ করেন তাদের জন্য:

from itertools import imap, starmap, islice, repeat
from functools import partial
from string import letters, digits, join
from random import choice

join_chars = partial(join, sep='')
identity = lambda o: o

def irand_seqs(symbols=join_chars((letters, digits)), length=6, join=join_chars, select=choice, breakup=islice):
    """ Generates an indefinite sequence of joined random symbols each of a specific length
    :param symbols: symbols to select,
        [defaults to string.letters + string.digits, digits 0 - 9, lower and upper case English letters.]
    :param length: the length of each sequence,
        [defaults to 6]
    :param join: method used to join selected symbol, 
        [defaults to ''.join generating a string.]
    :param select: method used to select a random element from the giving population. 
        [defaults to random.choice, which selects a single element randomly]
    :return: indefinite iterator generating random sequences of giving [:param length]
    >>> from tools import irand_seqs
    >>> strings = irand_seqs()
    >>> a = next(strings)
    >>> assert isinstance(a, (str, unicode))
    >>> assert len(a) == 6
    >>> assert next(strings) != next(strings)
    """
    return imap(join, starmap(breakup, repeat((imap(select, repeat(symbols)), None, length))))

এটি প্রথমে প্রদত্ত পুল থেকে এলোমেলোভাবে নির্বাচিত প্রতীকের অনির্দিষ্ট ক্রম তৈরির পরে একটি অনির্দিষ্ট [অসীম] পুনরুক্তি তৈরি করে, তারপরে এই অনুক্রমটিকে দৈর্ঘ্যের অংশগুলিতে ভেঙে দেয় যা পরে যুক্ত হয়, এটি গেটাইটেম সমর্থন করে এমন কোনও ক্রম দিয়ে কাজ করবে , ডিফল্টরূপে এটি কেবল আলফা সংখ্যাসূচক বর্ণগুলির একটি এলোমেলো ক্রম উত্পন্ন করে, যদিও আপনি সহজেই অন্যান্য জিনিস উত্পন্ন করতে পরিবর্তন করতে পারেন:

উদাহরণস্বরূপ অঙ্কের এলোমেলো tuples উত্পাদন:

>>> irand_tuples = irand_seqs(xrange(10), join=tuple)
>>> next(irand_tuples)
(0, 5, 5, 7, 2, 8)
>>> next(irand_tuples)
(3, 2, 2, 0, 3, 1)

আপনি যদি প্রজন্মের জন্য পরবর্তীটি ব্যবহার না করতে চান তবে আপনি কেবল এটিকে কল করতে পারেন:

>>> irand_tuples = irand_seqs(xrange(10), join=tuple)
>>> make_rand_tuples = partial(next, irand_tuples) 
>>> make_rand_tuples()
(1, 6, 2, 8, 1, 9)

আপনি যদি উড়ানের ক্রমটি তৈরি করতে চান তবে কেবল পরিচয়টিতে যোগ দিন।

>>> irand_tuples = irand_seqs(xrange(10), join=identity)
>>> selections = next(irand_tuples)
>>> next(selections)
8
>>> list(selections)
[6, 3, 8, 2, 2]

অন্যরা যেমন উল্লেখ করেছে যে আপনার যদি আরও সুরক্ষার প্রয়োজন হয় তবে উপযুক্ত নির্বাচন ফাংশনটি সেট করুন:

>>> from random import SystemRandom
>>> rand_strs = irand_seqs(select=SystemRandom().choice)
'QsaDxQ'

ডিফল্ট নির্বাচক choiceযা প্রতিটি অংশের জন্য একই প্রতীকটি একাধিকবার নির্বাচন করতে পারে, পরিবর্তে যদি আপনি একই অংশটি প্রতিটি অংশের জন্য একবারে নির্বাচিত করতে চান, তবে একটি সম্ভাব্য ব্যবহার:

>>> from random import sample
>>> irand_samples = irand_seqs(xrange(10), length=1, join=next, select=lambda pool: sample(pool, 6))
>>> next(irand_samples)
[0, 9, 2, 3, 1, 6]

sampleসম্পূর্ণ নির্বাচনের জন্য আমরা আমাদের নির্বাচক হিসাবে ব্যবহার করি, তাই খণ্ডগুলি প্রকৃতপক্ষে দৈর্ঘ্য 1, এবং যোগদানের জন্য আমরা কেবল কল করি nextযা পরবর্তী সম্পূর্ণরূপে উত্পন্ন অংশ নিয়ে আসে, এই উদাহরণটি কিছুটা জটিল বলে মনে হয় এবং এটি ...


3

(1) এটি আপনাকে সমস্ত ক্যাপ এবং নম্বর দেবে:

import string, random
passkey=''
for x in range(8):
    if random.choice([1,2]) == 1:
        passkey += passkey.join(random.choice(string.ascii_uppercase))
    else:
        passkey += passkey.join(random.choice(string.digits))
print passkey 

(২) আপনি যদি পরে আপনার কীতে ছোট হাতের অক্ষর অন্তর্ভুক্ত করতে চান তবে এটিও কাজ করবে:

import string, random
passkey=''
for x in range(8):
    if random.choice([1,2]) == 1:
        passkey += passkey.join(random.choice(string.ascii_letters))
    else:
        passkey += passkey.join(random.choice(string.digits))
print passkey  

3

এটি অনুরাগ ইউনিিয়ালের প্রতিক্রিয়া এবং এমন কিছু যা আমি নিজের উপর কাজ করছিলাম on

import random
import string

oneFile = open('‪Numbers.txt', 'w')
userInput = 0
key_count = 0
value_count = 0
chars = string.ascii_uppercase + string.digits + string.punctuation

for userInput in range(int(input('How many 12 digit keys do you want?'))):
    while key_count <= userInput:
        key_count += 1
        number = random.randint(1, 999)
        key = number

        text = str(key) + ": " + str(''.join(random.sample(chars*6, 12)))
        oneFile.write(text + "\n")
oneFile.close()

2
>>> import random
>>> str = []
>>> chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
>>> num = int(raw_input('How long do you want the string to be?  '))
How long do you want the string to be?  10
>>> for k in range(1, num+1):
...    str.append(random.choice(chars))
...
>>> str = "".join(str)
>>> str
'tm2JUQ04CK'

random.choiceফাংশন একটি তালিকায় একটি র্যান্ডম এন্ট্রি পছন্দ। আপনি একটি তালিকাও তৈরি করেন যাতে আপনি forবিবৃতিতে অক্ষরটি যুক্ত করতে পারেন । প্রান্তের শেষে ['টি', 'এম', '২', 'জে', 'ইউ', 'কিউ', '০', '৪', 'সি', 'কে'] রয়েছে তবে str = "".join(str)গ্রহণগুলি যে যত্ন, আপনাকে ছেড়ে 'tm2JUQ04CK'

আশাকরি এটা সাহায্য করবে!


দুর্দান্ত, তবে আপনি এর range(num)পরিবর্তে ব্যবহার করতে পারতেন , এবং str একটি স্ট্রিংও হতে পারে str += random.choice(chars)
ash

2
import string
from random import *
characters = string.ascii_letters + string.punctuation  + string.digits
password =  "".join(choice(characters) for x in range(randint(8, 16)))
print password

2
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এটি কীভাবে প্রশ্নের উত্তর দেয় সে সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে এর দীর্ঘমেয়াদী মানকে উল্লেখযোগ্যভাবে উন্নতি করবে। দয়া করে সম্পাদনা কিছু ব্যাখ্যা যোগ করার জন্য আপনার উত্তর।
টবির গতি

2
import random
q=2
o=1
list  =[r'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','s','0','1','2','3','4','5','6','7','8','9','0']
while(q>o):
    print("")

    for i in range(1,128):
        x=random.choice(list)
        print(x,end="")

এখানে লুপের জন্য স্ট্রিংয়ের দৈর্ঘ্য পরিবর্তন করা যেতে পারে অর্থাৎ আই রেঞ্জের জন্য (1, দৈর্ঘ্য) এটি সহজ অ্যালগরিদম যা বোঝা সহজ। এটি তালিকা ব্যবহার করে যাতে আপনার প্রয়োজনীয় অক্ষরগুলি বাতিল করতে পারেন।


1

একটি সাধারণ:

import string
import random
character = string.lowercase + string.uppercase + string.digits + string.punctuation
char_len = len(character)
# you can specify your password length here
pass_len = random.randint(10,20)
password = ''
for x in range(pass_len):
    password = password + character[random.randint(0,char_len-1)]
print password

0

আমি আপনাকে পরবর্তী বিকল্পটি বলতে চাই:

import crypt
n = 10
crypt.crypt("any sring").replace('/', '').replace('.', '').upper()[-n:-1]

প্যারানাইক মোড:

import uuid
import crypt
n = 10
crypt.crypt(str(uuid.uuid4())).replace('/', '').replace('.', '').upper()[-n:-1]

0

দুটি পদ্ধতি:

import random, math

def randStr_1(chars:str, length:int) -> str:
    chars *= math.ceil(length / len(chars))
    chars = letters[0:length]
    chars = list(chars)
    random.shuffle(characters)

    return ''.join(chars)

def randStr_2(chars:str, length:int) -> str:
    return ''.join(random.choice(chars) for i in range(chars))


মাপকাঠি :

from timeit import timeit

setup = """
import os, subprocess, time, string, random, math

def randStr_1(letters:str, length:int) -> str:
    letters *= math.ceil(length / len(letters))
    letters = letters[0:length]
    letters = list(letters)
    random.shuffle(letters)
    return ''.join(letters)

def randStr_2(letters:str, length:int) -> str:
    return ''.join(random.choice(letters) for i in range(length))
"""

print('Method 1 vs Method 2', ', run 10 times each.')

for length in [100,1000,10000,50000,100000,500000,1000000]:
    print(length, 'characters:')

    eff1 = timeit("randStr_1(string.ascii_letters, {})".format(length), setup=setup, number=10)
    eff2 = timeit("randStr_2(string.ascii_letters, {})".format(length), setup=setup, number=10)
    print('\t{}s : {}s'.format(round(eff1, 6), round(eff2, 6)))
    print('\tratio = {} : {}\n'.format(eff1/eff1, round(eff2/eff1, 2)))

আউটপুট:

Method 1 vs Method 2 , run 10 times each.

100 characters:
    0.001411s : 0.00179s
    ratio = 1.0 : 1.27

1000 characters:
    0.013857s : 0.017603s
    ratio = 1.0 : 1.27

10000 characters:
    0.13426s : 0.151169s
    ratio = 1.0 : 1.13

50000 characters:
    0.709403s : 0.855136s
    ratio = 1.0 : 1.21

100000 characters:
    1.360735s : 1.674584s
    ratio = 1.0 : 1.23

500000 characters:
    6.754923s : 7.160508s
    ratio = 1.0 : 1.06

1000000 characters:
    11.232965s : 14.223914s
    ratio = 1.0 : 1.27

প্রথম পদ্ধতির পারফরম্যান্স আরও ভাল।


0

আমি প্রায় সমস্ত উত্তর যদিও চলেছি কিন্তু তাদের কোনোটাই সহজ দেখাচ্ছে না। আমি আপনাকে প্যাসেজ লাইব্রেরি চেষ্টা করার পরামর্শ দেব যা সাধারণত এলোমেলো পাসওয়ার্ড তৈরি করতে ব্যবহৃত হয়।

আপনি আপনার পছন্দ মতো দৈর্ঘ্য, বিরামচিহ্ন, অঙ্ক, অক্ষর এবং কেস এর এলোমেলো স্ট্রিং তৈরি করতে পারেন

আপনার মামলার কোড এখানে:

from passgen import passgen
string_length = int(input())
random_string = passgen(length=string_length, punctuation=False, digits=True, letters=True, case='upper')

0

এলোমেলো 16-বাইট আইডি ধারক অক্ষর, সংখ্যা, '_' এবং '-' তৈরি করুন

os.urandom(16).translate((f'{string.ascii_letters}{string.digits}-_'*4).encode('ascii'))


-1
import string, random
lower = string.ascii_lowercase
upper = string.ascii_uppercase
digits = string.digits
special = '!"£$%^&*.,@#/?'

def rand_pass(l=4, u=4, d=4, s=4):
    p = []
    [p.append(random.choice(lower)) for x in range(l)]
    [p.append(random.choice(upper)) for x in range(u)]
    [p.append(random.choice(digits)) for x in range(d)]
    [p.append(random.choice(special)) for x in range(s)]
    random.shuffle(p)
    return "".join(p)

print(rand_pass())
# @5U,@A4yIZvnp%51

-2

আমি এটিকে সহজ এবং পরিষ্কার পরিচ্ছন্ন বলে মনে করেছি।

str_Key           = ""
str_FullKey       = "" 
str_CharacterPool = "01234ABCDEFfghij~>()"
for int_I in range(64): 
    str_Key = random.choice(str_CharacterPool) 
    str_FullKey = str_FullKey + str_Key 

দৈর্ঘ্য পরিবর্তনের জন্য কেবল 64 টি পরিবর্তন করুন, কেবলমাত্র আলফা কেবলমাত্র আলফা সংখ্যাসূচক বা সংখ্যাসূচক বা অদ্ভুত অক্ষর বা আপনি যা চান তা করতে চরিত্রপুলের পরিবর্তিত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.