রুবিতে এলোমেলো স্ট্রিং কীভাবে উত্পন্ন করা যায়


745

আমি বর্তমানে "A" .. "জেড" এর জন্য একটি 8-বর্ণের সিউডো-এলোমেলো বড় বড় স্ট্রিং তৈরি করছি:

value = ""; 8.times{value  << (65 + rand(25)).chr}

তবে এটি পরিষ্কার দেখায় না, এবং এটি আর্গুমেন্ট হিসাবে পাস করা যায় না কারণ এটি কোনও বিবৃতি নয়। "একটি" .. "জেড" প্লাস "এ" .. "জেড" মিশ্রিত ক্ষেত্রে স্ট্রিং পেতে, আমি এটিকে এতে পরিবর্তন করেছি:

value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}

তবে এটি আবর্জনার মতো দেখাচ্ছে।

কারও কি আরও ভাল পদ্ধতি আছে?


আমি বুঝতে পারছি না যে আপনি কেন এটি যত্ন করছেন "যেহেতু এটি একটি একক বিবৃতি নয় এটি এটিকে একটি আর্গুমেন্ট হিসাবে পাস করা যায় না"। কেন কেবল এটিকে একটি ইউটিলিটি বা সহায়ক পদ্ধতি হিসাবে তৈরি করবেন না?
ডেভিড জে

1
মনে করুন কোনও ব্যবহারকারীর পাসওয়ার্ড পুনরায় সেট করার জন্য কোনও পদ্ধতি আছে এবং এটিতে নতুন পাসওয়ার্ডের জন্য একটি যুক্তি রয়েছে। আমি একটি এলোমেলো স্ট্রিংয়ে যেতে চাই, উপরের কোডটিতে আমার একটি টেম্প ভেরিয়েবলের প্রয়োজন, যদিও একক বিবৃতিতে উদাহরণস্বরূপ আমি এক লাইনার হিসাবে পুরো জিনিসটি করতে পারি। নিশ্চিত যে কোনও ইউটিলিটি পদ্ধতি দীর্ঘমেয়াদে দুর্দান্ত হতে পারে, যেমন এখানে এবং সেখানে একইরকম প্রয়োজন হয় তবে কখনও কখনও আপনি কেবল এটি একবারে করতে চান done
জেফ

না, আপনাকে একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করতে হবে না। এটি চেষ্টা করুন: reset_user_password!(random_string)যেখানেdef random_string; SecureRandom.urlsafe_base64(20) end
ডেভিড জে

8 টি বর্ণ একটি লজ্জাজনকভাবে দুর্বল পাসওয়ার্ড। Md5sum দেওয়া একটি আধুনিক পিসি 30 সেকেন্ডের মধ্যে পাসওয়ার্ডটি পুনরুদ্ধার করতে পারে । আর আর কিছু সম্পর্কে কীsecurerandom.urlsafe_base64
কর্নেল প্যানিক

1
কেন এর এত উত্তর আছে? এটি কোনও দরকারী প্রশ্ন নয় তবে এটি কীভাবে মনোযোগ আকর্ষণ করেছে তা আমি আগ্রহী।
লু

উত্তর:


968
(0...8).map { (65 + rand(26)).chr }.join

আমি গল্ফ করতে খুব বেশি সময় ব্যয় করি।

(0...50).map { ('a'..'z').to_a[rand(26)] }.join

এবং একটি সর্বশেষ যা আরও বিভ্রান্তিকর, তবে আরও নমনীয় এবং কম চক্র নষ্ট করে:

o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
string = (0...50).map { o[rand(o.length)] }.join

203
34 অক্ষর এবং ফাস্ট গন্গনে: ('a'..'z').to_a.shuffle[0,8].join। নোট করুন আপনার রুবি> = 1.9 থেকে প্রয়োজন shuffle
fny

20
আপনার নিজের রোল করার জন্য ড্রাইভার না থাকলে বিদ্যমান লাইব্রেরিগুলি উত্তোলন করা ভাল। SecureRandomঅন্যান্য উত্তরে একটি উদাহরণ হিসাবে দেখুন ।
ডেভিড জে

28
@ ফারাজ আপনার পদ্ধতিটি কার্যত একই নয়, এটি প্রতিস্থাপনের সাথে এলোমেলো নয়।
মাইকেলহেলফোফিশ

35
[*('a'..'z'),*('0'..'9')].shuffle[0,8].joinঅক্ষর এবং সংখ্যা উভয় দিয়ে একটি এলোমেলো স্ট্রিং উত্পন্ন করতে।
রবিন

31
randনির্বিচারবাদী এবং অনুমানযোগ্য। পাসওয়ার্ড উত্পন্ন করার জন্য এটি ব্যবহার করবেন না! একটি ব্যবহার করুন SecureRandomপরিবর্তে সমাধান।
পেন্সিল

800

সিকিউরর্যান্ডম কেন ব্যবহার করবেন না?

require 'securerandom'
random_string = SecureRandom.hex

# outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81 (i.e. 32 chars of 0..9, a..f)

SecureRandom এর জন্যও পদ্ধতি রয়েছে:

  • করুন Base64-
  • random_bytes
  • random_number

দেখুন: http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html


11
বেস 64 হবে, তবে হেক্সের মতো নয় তার উদাহরণে
জেফ ডিকি

67
যাইহোক, এটি ১.৯ এবং সাম্প্রতিক ১.৮ সংস্করণে স্টাডলিবের অংশ, সুতরাং require 'securerandom'এই ঝরঝরে SecureRandomসাহায্যকারী পাওয়া যায় :)
জে -_- এল

21
সংস্করণ 3.2 সংস্করণে বিটিডাব্লু সিকিউরর্যান্ডমকে অ্যাক্টিভসপোর্ট থেকে সরানো হয়েছিল। চেঞ্জলগ থেকে: "স্ট্যান্ডার্ড অ্যাক্টিভাস্পোর্ট :: স্ট্যান্ডার্ড লাইব্রেরি থেকে সিকিউরআরন্ডমের পক্ষে সিকিউরআরন্ডম"।
মার্ক

15
SecureRandom.random_number(36**12).to_s(36).rjust(12, "0")0-9a-z (36 টি অক্ষর) সহ একটি স্ট্রিং উত্পন্ন করবে যা সর্বদা 12 অক্ষর দীর্ঘ। আপনি যে দৈর্ঘ্যে চান তা 12 পরিবর্তন করুন। দুর্ভাগ্যক্রমে কেবল এজেড ব্যবহারের কোনও উপায় নেই Integer#to_s
গেরি শ

1
@ স্ট্রিং00 এটি ভুল। আপনি যদি +fGH1কোনও ইউআরএল দিয়ে যেতে চান , আপনার কেবল এটি URL- এনকোড করা দরকার যেমন আপনি কোনও URL এর মধ্য দিয়ে যাচ্ছেন এমন কোনও মান হবে: %2BfGH1
nzifnab

247

আমি গ্যারান্টিযুক্ত সর্বাধিক দৈর্ঘ্যের সাথে এলোমেলো URL টি বন্ধুত্বপূর্ণ স্ট্রিং উত্পন্ন করার জন্য এটি ব্যবহার করি:

rand(36**length).to_s(36)

এটি ছোট হাতের এজে এবং 0-9 এর এলোমেলো স্ট্রিং উত্পন্ন করে। এটি খুব স্বনির্ধারিত নয় তবে এটি সংক্ষিপ্ত এবং পরিষ্কার।


4
সংক্ষিপ্ত সংস্করণের জন্য +1 (এটি বাহ্যিক বাইনারিগুলিকে কল করে না ^^)। যদি এলোমেলো স্ট্রিংটি জনসাধারণের মুখোমুখি না হয় তবে আমি মাঝে মাঝে এমনকি কেবল ব্যবহার করি rand.to_s; কুৎসিত, কিন্তু কাজ করে।
জো লিস

12
এটি একটি দুর্দান্ত সমাধান (এবং দ্রুতও) তবে এটি মাঝেমধ্যে দৈর্ঘ্যের নীচে একটি স্ট্রিং তৈরি করবে length, প্রায় 40 ডলারে একবার
ব্রায়ান ই

7
@Brian ই এই সংখ্যার যদি আপনি চান গ্যারান্টি হবে: (36**(length-1) + rand(36**length)).to_s(36)। ৩ * ** (দৈর্ঘ্য -১) বেস ৩ converted এ রূপান্তরিত হ'ল 10 ** (দৈর্ঘ্য -১) যা আপনি চান সংখ্যাটির দৈর্ঘ্য হ'ল এটি সর্বনিম্ন মান।
এরিক হু

11
এখানে সর্বদা পছন্দসই দৈর্ঘ্যের টোকেন উত্পাদন করা সংস্করণটি এখানে রয়েছে:(36**(length-1) + rand(36**length - 36**(length-1))).to_s(36)
অ্যাড্রিয়েন জার্থন

3
এটি আমার জন্য রেল 4 এবং রুবি NameError: undefined local variable or method ২.১.১ : দৈর্ঘ্য 'র জন্য একটি ত্রুটি ছড়িয়ে দিয়েছে: অবজেক্ট`
কাকুবেই

175

এই সমাধানটি অ্যাক্টিভেশন কোডগুলির জন্য সহজেই পঠনযোগ্য অক্ষরের একটি স্ট্রিং উত্পন্ন করে; আমি চাইনি যে লোকেরা 8 কে বি দিয়ে, 1 সাথে I, 0 সাথে ও, এল 1 দিয়ে ইত্যাদি বিভ্রান্ত করছে

# Generates a random string from a set of easily readable characters
def generate_activation_code(size = 6)
  charset = %w{ 2 3 4 6 7 9 A C D E F G H J K M N P Q R T V W X Y Z}
  (0...size).map{ charset.to_a[rand(charset.size)] }.join
end

3
'ইউ' অস্পষ্ট নাকি এটি টাইপো?
gtd

10
@ জিটিডি - হ্যাঁ ইউ এবং ভি হ'ল অবিগভোভ।
কলিনম

1
@ কলিনম ভি সেখানে আছে যদিও।
gtd

8
নিরাপদ হতে আপনাকে ব্যবহার করতে চান SecureRandom.random_number(charset.size)পরিবর্তেrand(charset.size)
gtd

1
আমি কেবল নিম্নতর কেস এবং / বা কিছু বিশেষ অক্ষর (শিফট + নাম) যুক্ত করে এটির উন্নতি করার চেষ্টা করছিলাম এবং নীচের তালিকাগুলি পেয়েছি: %w{ A C D E F G H J K L M N P Q R T W X Y Z 2 3 4 6 7 9 ! @ # $ % ^ & * +}এবং %w{ A D E F G H J L N Q R T Y a d e f h n r y 2 3 4 7 ! @ # $ % ^ & * }(প্রথম তালিকায় লোয়ার কেস অন্তর্ভুক্ত নয়, তবে এটি আর দীর্ঘ নয়) কী কী আকর্ষণীয় তা কাজ করা.
dkniffin

130

অন্যরা অনুরূপ কিছু উল্লেখ করেছেন তবে এটি URL টি নিরাপদ ফাংশন ব্যবহার করে।

require 'securerandom'
p SecureRandom.urlsafe_base64(5) #=> "UtM7aa8"
p SecureRandom.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg"
p SecureRandom.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ=="

ফলাফলটিতে এজেড, অ্যাজ, 0-9, "-" এবং "_" থাকতে পারে। প্যাডিং সত্য হলে "=" ব্যবহার করা হয়।


আমি ঠিক এটিই খুঁজছিলাম। ধন্যবাদ!
ড্যান উইলিয়ামস

69

রুবি 2.5, যেহেতু এটি এর সাথে সত্যই সহজ SecureRandom.alphanumeric:

len = 8
SecureRandom.alphanumeric(len)
=> "larHSsgL"

এটি এজেড, এজেড এবং 0-9যুক্ত র্যান্ডম স্ট্রিং উত্পন্ন করে এবং তাই বেশিরভাগ ব্যবহারের ক্ষেত্রে প্রয়োগ করা উচিত। এবং এগুলি এলোমেলোভাবে সুরক্ষিত উত্পন্ন হয়, এটিও একটি উপকারী হতে পারে।


সর্বাধিক উন্নতিযুক্ত সমাধানের সাথে এটির তুলনা করার জন্য এটি একটি মানদণ্ড:

require 'benchmark'
require 'securerandom'

len = 10
n = 100_000

Benchmark.bm(12) do |x|
  x.report('SecureRandom') { n.times { SecureRandom.alphanumeric(len) } }
  x.report('rand') do
    o = [('a'..'z'), ('A'..'Z'), (0..9)].map(&:to_a).flatten
    n.times { (0...len).map { o[rand(o.length)] }.join }
  end
end

                   user     system      total        real
SecureRandom   0.429442   0.002746   0.432188 (  0.432705)
rand           0.306650   0.000716   0.307366 (  0.307745)

সুতরাং randসমাধানটির সময় প্রায় 3/4 লাগে SecureRandom। আপনি যদি অনেকগুলি স্ট্রিং উত্পন্ন করে থাকেন তবে এটি আপনার পক্ষে গুরুত্বপূর্ণ হতে পারে তবে আপনি যদি সময়ে সময়ে কিছু এলোমেলো স্ট্রিং তৈরি করেন তবে আমি সবসময় আরও সুরক্ষিত প্রয়োগের সাথে যাব কারণ এটি কল করা আরও সহজ এবং আরও স্পষ্ট।


48
[*('A'..'Z')].sample(8).join

একটি এলোমেলো 8 অক্ষরের স্ট্রিং উত্পন্ন করুন (উদাঃ NVAYXHGR)

([*('A'..'Z'),*('0'..'9')]-%w(0 1 I O)).sample(8).join

এলোমেলো 8 টি অক্ষরের স্ট্রিং তৈরি করুন (উদাঃ 3PH4SWF2), 0/1 / I / O বাদ দেয়। রুবি ১.৯


4
শুধুমাত্র সমস্যা হ'ল ফলাফলের প্রতিটি অক্ষর অনন্য। সম্ভাব্য মান সীমাবদ্ধ করে।
tybro0103

1
যদি এই বৈশিষ্ট্যটির অনুরোধটি হয়ে যায় তবে রুবি 1.9.x প্রতিস্থাপন ছাড়াই নমুনা জন্য # নমুনা এবং প্রতিস্থাপনের সাথে নমুনার জন্য # পছন্দ দিয়ে শেষ হতে পারে।
ডেভিড জে

এটি একটি ত্রুটি, আমার মনে হয় আপনার প্রয়োজন ... [*("A".."Z")]'; ((একক কৌটস নয়))
jayunit100

তুমি আমাকে বলতে আমি কিভাবে পারে stubএই rspecপাস।
সিনস্কারি

31

আমি এটি কোথায় পেয়েছি তা মনে করতে পারি না তবে এটি আমার কাছে সেরা এবং সর্বনিম্ন প্রক্রিয়াটির মতো মনে হয়:

def random_string(length=10)
  chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
  password = ''
  length.times { password << chars[rand(chars.size)] }
  password
end

7
সম্ভবত আপনি এটি এখানে খুঁজে পেয়েছেন? travisonrails.com/2007/06/07/generate-random-text-with-ruby
মৃত

এটি থেকে কোনও 0 এবং 1 অনুপস্থিত নেই?
সানিরজুনেজা

দেখে মনে হচ্ছে এটি যেখানেই পেলাম।
ট্র্যাভিস রেডার

এবং হ্যাঁ, এটি 0 এবং 1 অনুপস্থিত মনে হচ্ছে।
ট্র্যাভিস রেডার

4
দ্য 0এবং 1এবং Oএবং Iইচ্ছাকৃতভাবে অনুপস্থিত ছিল না কারণ সেই অক্ষর দ্ব্যর্থক হয়। এই ধরণের কোডটি ব্যবহারকারীর অনুলিপি করা এমন অক্ষরের একটি সেট তৈরি করতে ব্যবহার করা হচ্ছে, প্রসঙ্গের বাইরে পার্থক্য করা কঠিন এমন অক্ষরগুলি বাদ দেওয়া ভাল।
অ্যান্ড্রু

28
require 'securerandom'
SecureRandom.urlsafe_base64(9)

SecureRandom একটি দুর্দান্ত কাজ। আমি জানতাম না এটি সেখানে ছিল। ধন্যবাদ।
ডগওয়েদার

পুরানো কুল (এবং Random.new.bytes(9)
কৃপণ

4
বিটিডাব্লু, ursafe_base64 দৈর্ঘ্যটি নির্দেশিত 4/3 দৈর্ঘ্যের প্রায় একটি স্ট্রিং প্রদান করে। একটি স্ট্রিং ঠিক n অক্ষর দীর্ঘ পেতে, চেষ্টাn=9 ; SecureRandom.urlsafe_base64(n)[0..n-1]
তারদেট

25

আপনি যদি নির্দিষ্ট দৈর্ঘ্যের একটি স্ট্রিং চান তবে ব্যবহার করুন:

require 'securerandom'
randomstring = SecureRandom.hex(n)

এটা তোলে দৈর্ঘ্যের একটি র্যান্ডম স্ট্রিং উত্পন্ন করবে 2nধারণকারী 0-9এবংa-f


এটি দৈর্ঘ্যের একটি স্ট্রিং উত্পন্ন করে না n, এটি আসলে একটি স্ট্রিং উত্পন্ন করে যা 4/3 এর n
ওমর আলী

@ ওমরআলি আপনি ভুল .hexএটি 2n এর ক্ষেত্রে রুবি ডকুমেন্টেশন অনুসারে । ডকুমেন্টেশন: SecureRandom.hex একটি র্যান্ডম হেক্সাডেসিমাল স্ট্রিং উত্পন্ন করে। আর্গুমেন্ট এনটি উত্পন্ন হওয়ার জন্য এলোমেলো সংখ্যাটির দৈর্ঘ্য, বাইটে নির্দিষ্ট করে। ফলাফলযুক্ত হেক্সাডেসিমাল স্ট্রিংয়ের দৈর্ঘ্য n এর দ্বিগুণ ।
রিহার্ডস


11
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,8]

আকর্ষণীয়, তবে বেশ খানিকটা কম্পিউটেশনালি ব্যয়বহুল
জেফ

এছাড়াও অক্ষরের সীমিত সুযোগের জন্য কোনও ক্ষমতা নেই।
কেন্ট ফ্রেড্রিক

3
মনে রাখবেন যে একটি হেক্স ডাইজেস্ট কেবল 0-9 এবং আফ্রিকান অক্ষর দেয়।
ওয়েবমেট

11

দৈর্ঘ্য 8 সহ এলোমেলো স্ট্রিংয়ের জন্য এখানে একটি লাইন সহজ কোড রয়েছে:

 random_string = ('0'..'z').to_a.shuffle.first(8).join

আপনি দৈর্ঘ্য 8 এলোমেলো পাসওয়ার্ড জন্য এটি ব্যবহার করতে পারেন:

random_password = ('0'..'z').to_a.shuffle.first(8).join

2
নিজেকে একটি পাসওয়ার্ড তৈরি করতে আপনার এটি ব্যবহার করা উচিত নয়, কারণ এই পদ্ধতিটি কোনও চরিত্রের পুনরাবৃত্তি করবে না। অতএব আপনি কেবলমাত্র P(36, 8) / 36^8 = 0.48 টি অক্ষরের জন্য P(36, 25) / 36^25 = 0.00001সম্ভাব্য অক্ষরের স্থান (25% জোর করা শক্তিশালী করতে 2x সহজ) বা 25 টি অক্ষরের জন্য সম্ভাব্য অক্ষরের স্থান (ru 100,000x বল প্রয়োগ করা সহজ) ব্যবহার করছেন।
হিমবাহ

10

রুবি ১.৯++:

ALPHABET = ('a'..'z').to_a
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

10.times.map { ALPHABET.sample }.join
#=> "stkbssowre"

# or

10.times.inject('') { |s| s + ALPHABET.sample }
#=> "fdgvacnxhc"

1
mapসমাধান সত্যিই চমৎকার!
মিশা মোরোশকো

আপনি #sampleকতগুলি উপাদান চান তা জানতে চাইতে পারেন। উদাহরণস্বরূপ ALPHABET.sample(10).join... রুবি
ডোক.আর.অর্গ.কোয়ার

এটা আসলে ভুল। sample(10)আপনাকে 10 অনন্য নমুনা দেয়। তবে আপনি তাদের পুনরাবৃত্তি করার অনুমতি দিতে চান। তবে আমি Array.new(10).mapপারফরম্যান্সের জন্য ব্যবহার করব
Saša Zejnilović

আমি নিম্ন এবং উচ্চতর উভয় ক্ষেত্রেই অক্ষর চাই। আমি ব্যবহার Array.newএবং এটির ব্লক বাক্য গঠনতেও স্যুইচ করেছি । Array.new(20) { [*'0'..'9', *'a'..'z', *'A'..'Z'].sample }.join
টেলরথুর্লো

8

সচেতন থাকুন: randআক্রমণকারীর পক্ষে অনুমানযোগ্য এবং তাই সম্ভবত অনিরাপদ। এটি অবশ্যই পাসওয়ার্ড উত্পন্ন করার জন্য যদি SecureRandom ব্যবহার করা উচিত। আমি এই জাতীয় কিছু ব্যবহার:

length = 10
characters = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a

password = SecureRandom.random_bytes(length).each_char.map do |char|
  characters[(char.ord % characters.length)]
end.join

এটি সম্ভবত "সর্বাধিক" সুরক্ষিত সমাধান। SecureRandom অপারেটিং সিস্টেম দ্বারা সরবরাহিত অন্তর্নিহিত সুরক্ষা API গুলি ব্যবহার করার চেষ্টা করে। আপনার যদি ওপেনএসএসএল থাকে তবে এটি ব্যবহার করবে, আপনি উইন্ডোতে থাকলে এটি সেখানে সেরা বিকল্প হিসাবে চলে যাবে। আমি বিশেষত এই সমাধানটি পছন্দ করি কারণ এটি আপনাকে ব্যবহারের জন্য অক্ষরের একটি সেট নির্দিষ্ট করার অনুমতি দেয়। যদিও আপনার অক্ষর সেটটি বাইটের সর্বাধিক মানের চেয়ে দীর্ঘ হয় তবে এটি কাজ করবে না: আমি ডকুমিতে SecureRandom এর উত্স কোডটি দেখার পরামর্শ দিচ্ছি: রুবি-ডোক.আর.এস.সিডিএলিব-1.9.3
শুক্রবার

8

দৈর্ঘ্য 8 সহ এলোমেলো পাসওয়ার্ডের জন্য একটি সাধারণ কোড এখানে রয়েছে:

rand_password=('0'..'z').to_a.shuffle.first(8).join

7

আমি ব্যবহার করতে চাই অন্য একটি পদ্ধতি:

 rand(2**256).to_s(36)[0..7]

ljustআপনি যদি সত্যিকারের স্ট্রিংয়ের দৈর্ঘ্যের বিষয়ে ভ্রান্ত হন তবে যুক্ত করুন :

 rand(2**256).to_s(36).ljust(8,'a')[0..7]

স্ট্রিংয়ের ডান হাতটি ব্যবহার করে এলোমেলো সংখ্যার নূন্যতম উল্লেখযোগ্য অংশটি দখল করা আরও ভাল: র্যান্ড (2 ** 64)। টো (এসএস) (36) [- 10,10]
জেফ

6
SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')

ডিভাইস থেকে কিছু


এটি স্ট্রিং অক্ষর ব্যবহার করে কেন প্রতিস্থাপন করছে .tr('+/=lIO0', 'pqrsxyz')?
মাইগুয়েলকোবাইন

বিশেষ অক্ষরগুলি কারণ তারা নিরাপদ ইউআরএল নয়। এবং l / I বা O / 0 কারণ আপনি পড়ার যোগ্য ব্যবহারকারীর পাসওয়ার্ড তৈরি করার কৌশলটি ব্যবহার করলে তারা খুব সহজেই বিভ্রান্ত হয়।
টনিটর্নাডো

এই ফাংশনটিতে কিছু নির্দিষ্ট চরিত্রের প্রতি পক্ষপাত রয়েছে। অন্যান্য দৈর্ঘ্যের জন্য (উদাহরণস্বরূপ 16), শেষ অক্ষর এলোমেলো হবে না। এটি এড়ানোর একটি উপায় এখানে। SecureRandom.base64 (64) .tr ('+ / = lIO01', '') [0,16]
শাই কোলেম্যান

5

আমি মনে করি এটি সংক্ষিপ্ততা, স্পষ্টতা এবং পরিবর্তনের স্বাচ্ছন্দ্যের একটি দুর্দান্ত ভারসাম্য।

characters = ('a'..'z').to_a + ('A'..'Z').to_a
# Prior to 1.9, use .choice, not .sample
(0..8).map{characters.sample}.join

সহজেই সংশোধিত

উদাহরণস্বরূপ, সংখ্যা সহ:

characters = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a

বড় হাতের অক্ষর:

characters = ('A'..'F').to_a + (0..9).to_a

সত্যিকারের চিত্তাকর্ষক অ্যারেগুলির জন্য:

characters = (32..126).to_a.pack('U*').chars.to_a

1
আমি এটির জন্য কেবল বড় বড় অক্ষর + সংখ্যা ব্যবহার করার পরামর্শ দিই, "বিভ্রান্তিকর" অক্ষরগুলিও সরিয়ে ফেলব = (১.৯)। to_a.concat (('এ' .. 'জেড') to | [0, 1, 'ও', 'আমি']। অন্তর্ভুক্ত? (ক)} (0 ... আকার)। মানচিত্র {চরসেট [র্যান্ড (চরসেট.সাইজ)]} .জৌিন
দীপ্তি

5

এখানে কেবল আমার সেন্ট যুক্ত করা হচ্ছে ...

def random_string(length = 8)
  rand(32**length).to_s(32)
end

3
এনবি: এটি সর্বদা + দৈর্ঘ্য + দীর্ঘকে স্ট্রিং দেয় না - এটি আরও কম হতে পারে। এটি দ্বারা ফিরে আসা সংখ্যার উপর নির্ভর করেrand
টারডেটের

5

আপনি String#randomরুবি জহমের মুখগুলি থেকে ব্যবহার করতে পারেন facets

এটি মূলত এটি করে:

class String
  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    characters = character_set.map { |i| i.to_a }.flatten
    characters_len = characters.length
    (0...len).map{ characters[rand(characters_len)] }.join
  end
end

4

আমার প্রিয় (:A..:Z).to_a.shuffle[0,8].join। নোট করুন যে রদবদলের জন্য রুবি> 1.9 প্রয়োজন।


4

এই সমাধানটির বাহ্যিক নির্ভরতা প্রয়োজন তবে এটি অন্যটির চেয়ে সুন্দর বলে মনে হচ্ছে।

  1. জহর ফেকার ইনস্টল করুন
  2. Faker::Lorem.characters(10) # => "ang9cbhoa8"

4

প্রদত্ত:

chars = [*('a'..'z'),*('0'..'9')].flatten

একক অভিব্যক্তি, একটি আর্গুমেন্ট হিসাবে পাস করা যেতে পারে, সদৃশ অক্ষরকে অনুমতি দেয়:

Array.new(len) { chars.sample }.join

3

আমি রাডারের উত্তরটি সবচেয়ে পছন্দ করি, এখন পর্যন্ত, আমি মনে করি। আমি এইরকম কিছু টুইট করতাম:

CHARS = ('a'..'z').to_a + ('A'..'Z').to_a
def rand_string(length=8)
  s=''
  length.times{ s << CHARS[rand(CHARS.length)] }
  s
end

কেন ব্যবহার (CHARS*length).sample(length).joinকরবেন না ?
নিলস

@niels এই পরামর্শটি পুনরাবৃত্তি না করা অক্ষরের পক্ষে, একটি ওজনযুক্ত স্ট্রিং উত্পন্ন করবে । উদাহরণস্বরূপ, যদি CHARS=['a','b']তারপর আপনার পদ্ধতি উৎপন্ন হবে "aa"বা "bb"শুধুমাত্র সময়ের 33%, কিন্তু "ab"বা "ba"সময় 67%। হতে পারে এটি কোনও সমস্যা নয়, তবে এটি মনে রাখা উচিত!
টম লর্ড

ভাল কথা, @ টমলর্ড, আমি মনে করি আমি আসলে বুঝতে পারি নি যে আমি যখন এই পরামর্শটি পোস্ট করেছি (যদিও আমি অবশ্যই স্বীকার করতে হবে যে আমি এটি পোস্ট করা মোটেই মনে করি না: ডি)
নিলস


3

আমার 2 সেন্ট:

  def token(length=16)
    chars = [*('A'..'Z'), *('a'..'z'), *(0..9)]
    (0..length).map {chars.sample}.join
  end


3

3 টি ব্যাপ্তির সমন্বয়ে এলোমেলো স্ট্রিংয়ের 2 টি সমাধান:

(('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a).sample(8).join

([*(48..57),*(65..90),*(97..122)]).sample(8).collect(&:chr)*""

প্রতিটি রেঞ্জের একটি চরিত্র।

এবং যদি আপনার প্রতিটি পরিসর থেকে কমপক্ষে একটি চরিত্রের প্রয়োজন হয় যেমন একটি র্যান্ডম পাসওয়ার্ড তৈরি করতে যার একটি বড় হাতের অক্ষর, একটি ছোট হাতের অক্ষর এবং একটি ডিজিট থাকে তবে আপনি এই জাতীয় কিছু করতে পারেন:

( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) ).shuffle.join 
#=> "Kc5zOGtM0H796QgPp8u2Sxo1"

এবং আপনি যদি প্রতিটি পরিসরের একটি নির্দিষ্ট সংখ্যা প্রয়োগ করতে চান তবে আপনি এর মতো কিছু করতে পারেন:( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) + [ "%", "!", "*" ].sample(8) ).shuffle.join #=> "Kc5zOGtM0*H796QgPp%!8u2Sxo1"
জোশুয়া পিন্টার

3

62 অক্ষর থেকে 8 বাইট র্যান্ডম স্ট্রিং উত্পন্ন করতে আমি সম্প্রতি এমন কিছু করছি। অক্ষরগুলি 0-9, এজেড, এজেড ছিল। আমি 8 বার লুপ করে এবং অ্যারের বাইরে এলোমেলো মান বাছাইয়ের সাথে আমার একটি অ্যারে ছিল। এটি একটি রেল অ্যাপের অভ্যন্তরে ছিল।

str = ''
8.times {|i| str << ARRAY_OF_POSSIBLE_VALUES[rand(SIZE_OF_ARRAY_OF_POSSIBLE_VALUES)] }

আশ্চর্যের বিষয়টি হ'ল আমি খুব ভাল সংখ্যক সদৃশ পেয়েছি। এখন এলোমেলোভাবে এটি কখনও কখনও ঘটবে না। 62 ^ 8 বিশাল, তবে ডিবিতে 1200 বা এর মধ্যে কোডের মধ্যে আমার খুব ভাল সংখ্যক নকল ছিল। আমি তাদের একে অপরের ঘন্টা গণ্ডি ঘটছে লক্ষ্য। অন্য কথায় আমি १२:২৩:২৩ এবং ২:২২:২২ তে একটি দ্বিধা দেখতে পাচ্ছি বা এর মতো কিছু ... সময় ইস্যু কিনা তা নিশ্চিত নয়।

এই কোডটি একটি অ্যাক্টিভেকর্ড অবজেক্ট তৈরির আগে ছিল। রেকর্ড তৈরি হওয়ার আগে এই কোডটি চালিত করে 'অনন্য' কোড তৈরি করে। ডিবিতে প্রবেশকারীদের সর্বদা নির্ভরযোগ্যভাবে তৈরি করা হত তবে কোডটি (str উপরের লাইনে) খুব বেশি বার নকল করা হত।

আমি উপরের লাইনের 100000 পুনরাবৃত্তির মধ্য দিয়ে অল্প বিলম্বের সাথে চালানোর জন্য একটি স্ক্রিপ্ট তৈরি করেছি যাতে ঘন্টাখানেকের ভিত্তিতে কোনও ধরণের পুনরাবৃত্তি প্যাটার্নটি দেখার আশায় 3-4 ঘন্টা সময় লাগবে, কিন্তু কিছুই দেখেনি। আমার রেলস অ্যাপ্লিকেশনটিতে কেন এমনটি হয়েছিল তা আমার কোনও ধারণা নেই।

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