2011-05-11 10 views
33

मैं इस कोड तो यह अनूठा क्रमरहित अक्षर और अंक लोअर केस में उत्पन्न करता है कैसे तय कर सकते हैं?उत्पन्न अक्षर और अंक लोअर केस में साथ अद्वितीय यादृच्छिक स्ट्रिंग

api_string = (0...32).map{65.+(rand(25)).chr}.join  

फिलहाल, यह केवल अक्षरों को उत्पन्न करता है।

+1

संख्या के लिए सीमा 48 57. करने के लिए ये शामिल किया जाना चाहिए है आपकी सीमा में – soandos

+0

उत्तर के लिए धन्यवाद। क्या आप एक उदाहरण दे सकते हैं ताकि मैं इसे सही के रूप में चिह्नित कर सकूं? [कैसे सबसे अच्छा रूबी में एक यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए] की – donald

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/88311/how-best-to-generate-a-random-string-in-ruby) – user

उत्तर

80

हैं आप गहरे लाल रंग का प्रयोग कर रहे हैं आप SecureRandom उपयोग कर सकते हैं 1.9.2:

irb(main):001:0> require 'securerandom' 
=> true 
irb(main):002:0> SecureRandom.hex(13) 
=> "5bbf194bcf8740ae8c9ce49e97" 
irb(main):003:0> SecureRandom.hex(15) 
=> "d2413503a9618bacfdb1745eafdb0f" 
irb(main):004:0> SecureRandom.hex(32) 
=> "432e0a359bbf3669e6da610d57ea5d0cd9e2fceb93e7f7989305d89e31073690" 
+2

यह आसान है सरल की जरूरत है लेकिन अल्फा श्रृंखला के लिए केवल वायुसेना है, इसलिए सुरक्षा/उत्पन्न स्ट्रिंग की जटिलता के रूप में उच्च के रूप में यह हो सकता है नहीं है। –

+5

बेहतर बेस 64 है, जो भी में बनाया गया है का उपयोग करें: SecureRandom.base64 (16) .gsub (/ = + $ /, '') –

+4

नहीं एक API कुंजी के लिए एक मुद्दा है, लेकिन वहाँ भी है काम urlsafe_base64 विधि: SecureRandom.urlsafe_base64 (16) => "XpMnLfc3FySd-C4V2Ipxag" –

1
CHARS = (?0..?9).to_a + (?a..?z).to_a 
api_string = 32.times.inject("") {|s, i| s << CHARS[rand(CHARS.size)]} 
1

यहाँ एक तरीका यह करना है:

POSSIBLE = (('A'..'Z').to_a + (0..9).to_a) 
api_string = (0...32).map { |n| POSSIBLE.sample }.join 

आप सक्रिय समर्थन आप भी ऐसा कर सकते हैं एक API कुंजी की तरह स्ट्रिंग बनाने के लिए उपलब्ध है, तो:

ActiveSupport::SecureRandom.hex(32) 
26

सभी अक्षर और अंक, कि कैसे संख्या आधार 36.

api_string = Array.new(32){rand(36).to_s(36)}.join 
+0

तुम क्यों लगता है कि यह हमेशा अनूठा होगा करते हैं? कि 'रैंड (36 ** लेन) (36) .length == len', तो आप ऐसा – user1735921

2

मैं कहाँ से भूल में प्रतिनिधित्व कर रहे हैं, लेकिन मैं इस किसी भी तरह आज सुबह

l,m = 24,36 
rand(m**l).to_s(m).rjust(l,'0') 

इसे करने के लिए 0 से यादृच्छिक संख्या बनाने पढ़ा है आधार-36 के लिए बिजली (36,24), तो यह परिवर्तित स्ट्रिंग (कि 0-9 है और az)

+1

यह steenslag के https://gist.github.com/cameron-martin/a7a91f0bc952e8a5c795 –

+1

छोड़कर यह हमेशा सच नहीं है की तुलना में तेजी है .to_s 'रैंड करना होगा (36 ** लेन) .to_s (36) .rjust (लेन, '0')' –

+0

अच्छा! मैं अभी-अभी उत्तर संपादित कर दिया है: 3 – Kokizzu

0
((('a'..'z').to_a + (0..9).to_a)*3).shuffle[0,(rand(100).to_i)].join 

rand(n) जहांसाथ rand(100) बदलेंआपकी वांछित स्ट्रिंग की अधिकतम लंबाई है।

0
माणिक भाषा का SecureRandom का उपयोग कर

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

यह उत्पन्न होगा n * 2 यादृच्छिक स्ट्रिंग है "0-9" और "वायुसेना"

15

8.times.map { [*'0'..'9', *'a'..'z'].sample }.join

+0

' '0' .. '9'' 0 से 9 तक एक सरणी उत्पन्न करता है, और'' z'' z करने के लिए एक से एक सरणी उत्पन्न करता है एक '..', लेकिन क्या उनमें से प्रत्येक के ठीक पहले * करता है? – vipin8169

+1

'' 0 '..' 9'' रेंज है और '*' स्प्लट ऑपरेटर है। यह श्रेणी के तत्वों को एकल आइटम में विभाजित करता है जो समूह के रूप में लौटाए जाते हैं, इसलिए मूल रूप से '*' तत्वों को अलग करने में आपकी सहायता कर रहा है ताकि उन्हें स्पष्टीकरण के लिए 'नमूना' विधि –

+0

धन्यवाद का उपयोग करके नमूनाकरण किया जा सके :) – vipin8169

-1
Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36) 
संबंधित मुद्दे