Comment puis-je corriger ce code afin qu'il génère des lettres et des chiffres aléatoires uniques en minuscules?
api_string = (0...32).map{65.+(Rand(25)).chr}.join
Pour le moment, il ne génère que des lettres.
Si vous utilisez Ruby 1.9.2, vous pouvez utiliser 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"
Toutes les lettres et tous les chiffres, voilà comment les chiffres sont représentés en base 36.
api_string = Array.new(32){Rand(36).to_s(36)}.join
8.times.map { [*'0'..'9', *'a'..'z'].sample }.join
j'ai oublié d'où, mais j'ai lu ceci d'une façon ou d'une autre ce matin
l,m = 24,36
Rand(m**l).to_s(m).rjust(l,'0')
il crée un nombre aléatoire de 0 à puissance (36,24), puis le convertit en chaîne en base 36 (c'est à dire 0-9 et a-z)
Voici une façon de le faire:
POSSIBLE = (('A'..'Z').to_a + (0..9).to_a)
api_string = (0...32).map { |n| POSSIBLE.sample }.join
Si Active Support est disponible, vous pouvez également le faire pour créer une chaîne semblable à une clé API:
ActiveSupport::SecureRandom.hex(32)
Cela générera une chaîne aléatoire inférieure de 32 à 50 caractères, comprenant des chiffres et des lettres, les deux:
require 'string_pattern'
puts "32-50:/xN/".gen
((('a'..'z').to_a + (0..9).to_a)*3).shuffle[0,(Rand(100).to_i)].join
Remplacez Rand(100)
par Rand(n)
où n
est la longueur maximale de la chaîne souhaitée.
CHARS = (?0..?9).to_a + (?a..?z).to_a
api_string = 32.times.inject("") {|s, i| s << CHARS[Rand(CHARS.size)]}
Les nouvelles versions de Ruby supportent SecureRandom.base58 , ce qui vous donnera des jetons beaucoup plus denses que hex, sans caractères spéciaux.
> SecureRandom.base58(24)
> "Zp9N4aYvQfz3E6CmEzkadoa2"
utilisant SecureRandom du langage Ruby.
require 'securerandom' randomstring = SecureRandom.hex(5)
Il générera la chaîne aléatoire n * 2 contenant «0-9» et «a-f»