2012-09-25 13 views
5

Próbujesz generować losowe cyfry za pomocą szyny SecureRandom. Czy możemy utworzyć losową liczbę za pomocą SecureRandom.hex, która zawiera tylko cyfry i nie zawiera żadnych alfabetów.Bezpieczne losowe cyfry heksadecymalne

Na przykład:

Zamiast

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

Powinno dać

SecureRandom.hex(4) 
=> "95237267" 

Odpowiedz

8

Sprawdź API dla SecureRandom: http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html

wierzę szukasz dla inna metoda: #random_number.

SecureRandom.random_number(a_big_number) 

Ponieważ #hex zwraca liczbę heksadecymalną, nietypowe byłoby zapytanie o wynik losowy zawierający tylko znaki numeryczne.

W podstawowych przypadkach wystarczy użyć #rand.

rand(9999) 

Zmieniano:

nie jestem świadomy biblioteki, która generuje losową liczbę określonej długości, ale wydaje się dość proste do napisania jednego. Oto moja przepustka na to:

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

Sposób #rand_by_length bierze całkowitą długość określając jako param i próbuje wygenerować losową liczbę cyfr max na podstawie długości. Centrum ciągu # służy do uzupełniania brakujących liczb znakami liczb losowych. Najgorsze przypadki wywołania #rand dla każdej cyfry o określonej długości. To może zaspokoić twoją potrzebę.

+0

Dzięki za sprostowanie na "liczbę szesnastkową" Chciałbym wyjaśnić to dalej, faktycznie szukałem losowej liczby o określonej długości (pozwala s ay 8), hex ogranicza długość, więc zastanawiasz się nad czymś podobnym, SecureRandom może to generować tylko liczby. SecureRandom.random_number (n) prawdopodobnie nie pozwoli na to? [random_number] (http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html#M000733) – swapab

+0

Zaktualizowałem swoją odpowiedź na podstawie Twojego komentarza. – rossta

+0

To jest fajne ... Bardzo dziękuję za ten kod ... – swapab

1

Numeryczne identyfikatory są dobre, ponieważ są łatwiejsze do odczytania przez telefon (nie c dla charlie).

Spróbuj

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

i dla punktów bonusowych złamać go dla łatwiejszego odczytu

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

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

takie proste :)

+0

zapomniałem tego, dziękuję @zondo – avital

+0

Mój 1 cent: Bez ikony '(0..9) .to_a.sample (długość) .join' – swapab

+0

@ swap.nil dlaczego jest lepiej? – avital