安全随机十六进制数字

时间:2012-09-25 11:42:49

标签: ruby ruby-on-rails-3

尝试使用SecureRandom类rails生成随机数字。我们可以使用SecureRandom.hex创建一个随机数,其中只包含数字而不包含字母。

例如:

而不是

SecureRandom.hex(4)
=> "95bf7267"

应该给出

SecureRandom.hex(4)
=> "95237267"

3 个答案:

答案 0 :(得分:9)

查看SecureRandom的api:http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html

我相信你正在寻找一种不同的方法:#random_number。

SecureRandom.random_number(a_big_number)

由于#hex返回一个十六进制数字,因此要求一个只包含数字字符的随机结果是不常见的。

对于基本用例,使用#rand很简单。

rand(9999)

编辑:

我不知道有一个库会生成一个指定长度的随机数,但写一个就好了。这是我的传递:

def rand_by_length(length)
  rand((9.to_s * length).to_i).to_s.center(length, rand(9).to_s).to_i
end

方法#rand_by_length采用指定长度的整数作为参数,并尝试根据长度生成随机数的最大数字。 String#center用于使用随机数字符填充缺失的数字。最坏的情况是为指定长度的每个数字调用#rand。这可能符合您的需求。

答案 1 :(得分:1)

数字ID是好的,因为它们更容易通过电话阅读(查理没有c)。

试试这个

length = 20
id = (SecureRandom.random_number * (10**length)).round.to_s # => "98075825200269950976"

奖励积分将其分解以便于阅读

id.split(//).each_slice(4).to_a.map(&:join).join('-') # => "9807-5825-2002-6995-0976"

答案 2 :(得分:1)

length = 4

[*'0'..'9'].sample(length).join

就这么简单:)