2011-05-11 76 views
33

如何修復此代碼,以便以小寫字母生成唯一的隨機字母和數字?用小寫字母和數字生成唯一的隨機字符串

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

目前,它只生成字母。

+1

範圍爲數字爲48〜57。這些必須包含在你的範圍內。 – soandos 2011-05-11 15:41:28

+0

感謝您的回答。你能舉一個例子,我可以把它標記爲正確的嗎? – donald 2011-05-11 15:43:50

+0

[在Ruby中如何最好地生成一個隨機字符串]可能的重複(http://stackoverflow.com/questions/88311/how-best-to-generate-a-random-string-in-ruby) – user 2015-03-25 08:20:04

回答

80

如果你正在使用紅寶石1.9.2你可以使用SecureRandom:

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

這是很方便的對於簡單的需求,但alpha範圍只有af,所以生成的字符串的安全性/複雜性不如它可能高。 – 2013-02-06 10:20:57

+5

最好使用base64,它也內置在:SecureRandom.base64(16).gsub(/ = + $ /,'') – 2013-05-24 04:34:25

+4

對於API密鑰不是問題,但也有方便的urlsafe_base64方法:SecureRandom.urlsafe_base64 (16)=>「XpMnLfc3FySd-C4V2Ipxag」 – 2013-08-25 13:03:42

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

你爲什麼認爲它永遠是獨一無二的? – user1735921 2017-09-28 10:07:12

2

我從那裏忘了代表,但今天上午

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

從0創建隨機數我讀過這個莫名其妙功率(36,24),然後將其轉換到基座-36串(即0-9和AZ)

+1

這比steenslag的https://gist.github.com/cameron-martin/a7a91f0bc952e8a5c795 – 2014-06-12 02:41:27

+1

更快除了'rand(36 ** len).to_s(36).length == len'並非總是如此,所以你將必須做'蘭特(36 ** len).to_s(36).rjust(len,'0')' – 2014-06-12 02:54:01

+0

好!我剛剛編輯了答案:3 – Kokizzu 2014-06-12 06:14:44

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

rand(n)其中替換是你想要的字符串的最大長度。

0

使用紅寶石語言的SecureRandom。

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

它將生成N * 2隨機字符串包含「0-9「和‘AF’

15

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

+0

''0'..'9''生成一個從0到9的數組,'a'..'z''生成一個從a到z的數組,但是在他們每個人做什麼之前,他們確實做過了嗎 – vipin8169 2016-05-30 12:21:09

+1

''0'..'9''是範圍,'*'是splat操作符。它將範圍內的元素拆分爲單個項目,這些項目作爲一個組返回,因此基本上'*'正在幫助您分離出元素,以便可以使用'sample'方法對樣本進行抽樣。 – 2016-06-01 06:34:33

+0

謝謝您的解釋:) – vipin8169 2016-06-01 06:48:41

-1
Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36) 
相關問題