Saat ini saya sedang membuat string huruf kapital pseudo-acak 8-karakter untuk "A" .. "Z":
value = ""; 8.times{value << (65 + rand(25)).chr}
tapi itu tidak terlihat bersih, dan itu tidak bisa diajukan sebagai argumen karena itu bukan pernyataan tunggal. Untuk mendapatkan string case campuran "a" .. "z" plus "A" .. "Z", saya mengubahnya menjadi:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
tapi sepertinya sampah.
Adakah yang punya metode yang lebih baik?
reset_user_password!(random_string)
manadef random_string; SecureRandom.urlsafe_base64(20) end
securerandom.urlsafe_base64
Jawaban:
Saya menghabiskan terlalu banyak waktu bermain golf.
Dan yang terakhir bahkan lebih membingungkan, tetapi lebih fleksibel dan membuang lebih sedikit siklus:
sumber
('a'..'z').to_a.shuffle[0,8].join
. Perhatikan bahwa Anda perlu Ruby> = 1.9 hinggashuffle
.SecureRandom
sebagai satu contoh, dalam jawaban lainnya.[*('a'..'z'),*('0'..'9')].shuffle[0,8].join
untuk menghasilkan string acak dengan huruf dan angka.rand
bersifat deterministik dan dapat diprediksi. Jangan gunakan ini untuk menghasilkan kata sandi! Gunakan salah satuSecureRandom
solusi sebagai gantinya.Mengapa tidak menggunakan SecureRandom?
SecureRandom juga memiliki metode untuk:
lihat: http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html
sumber
require 'securerandom'
mendapatkanSecureRandom
pembantu yang rapi ini :)SecureRandom.random_number(36**12).to_s(36).rjust(12, "0")
akan menghasilkan string dengan 0-9a-z (36 karakter) yang SELALU 12 karakter. Ubah 12 hingga berapa pun panjang yang Anda inginkan. Sayangnya tidak ada cara untuk hanya menggunakan AZInteger#to_s
.+fGH1
URL, Anda hanya perlu menyandikan URL-nya seperti Anda akan nilai APAPUN yang melalui URL:%2BfGH1
Saya menggunakan ini untuk menghasilkan string ramah URL acak dengan panjang maksimum yang dijamin:
Ini menghasilkan string acak dari huruf kecil az dan 0-9. Ini tidak sangat dapat dikustomisasi tetapi pendek dan bersih.
sumber
rand.to_s
; jelek, tapi berhasil.length
panjang, kira-kira sekali dalam ~ 40(36**(length-1) + rand(36**length)).to_s(36)
. 36 ** (panjang-1) dikonversi ke basis 36 adalah 10 ** (panjang-1), yang merupakan nilai terkecil yang memiliki panjang digit yang Anda inginkan.(36**(length-1) + rand(36**length - 36**(length-1))).to_s(36)
NameError: undefined local variable or method
length 'for main: Object`Solusi ini menghasilkan serangkaian karakter yang mudah dibaca untuk kode aktivasi; Saya tidak ingin orang membingungkan 8 dengan B, 1 dengan I, 0 dengan O, L dengan 1, dll.
sumber
SecureRandom.random_number(charset.size)
rand(charset.size)
%w{ A C D E F G H J K L M N P Q R T W X Y Z 2 3 4 6 7 9 ! @ # $ % ^ & * +}
dan%w{ A D E F G H J L N Q R T Y a d e f h n r y 2 3 4 7 ! @ # $ % ^ & * }
(daftar pertama tidak termasuk huruf kecil, tetapi lebih lama) Agak menarik bagaimana itu berhasil.Yang lain menyebutkan sesuatu yang serupa, tetapi ini menggunakan fungsi URL safe.
Hasilnya mungkin mengandung AZ, az, 0-9, “-” dan “_”. “=” Juga digunakan jika bantalan benar.
sumber
Sejak Ruby 2.5, sangat mudah dengan
SecureRandom.alphanumeric
:Ini menghasilkan string acak yang mengandung AZ, az dan 0-9 dan karenanya harus berlaku di sebagian besar kasus penggunaan. Dan mereka dihasilkan secara acak aman, yang mungkin bermanfaat juga.
Ini adalah tolok ukur untuk membandingkannya dengan solusi yang paling banyak mendapat dukungan:
Jadi
rand
solusinya hanya membutuhkan sekitar 3/4 dari waktuSecureRandom
. Itu mungkin penting jika Anda menghasilkan banyak string, tetapi jika Anda hanya membuat beberapa string acak dari waktu ke waktu, saya akan selalu menggunakan implementasi yang lebih aman karena juga lebih mudah untuk dipanggil dan lebih eksplisit.sumber
Hasilkan string 8 huruf acak (mis. NVAYXHGR)
Menghasilkan string 8 karakter acak (mis. 3PH4SWF2), tidak termasuk 0/1 / I / O. Ruby 1.9
sumber
[*("A".."Z")]'
; ((bukan qoutes tunggal))stub
ini untukrspec
lulus.Saya tidak ingat di mana saya menemukan ini, tetapi sepertinya yang terbaik dan paling sedikit proses intensif bagi saya:
sumber
0
dan1
danO
danI
sengaja hilang karena karakter-karakter itu ambigu. Jika kode semacam ini digunakan untuk menghasilkan sekumpulan karakter yang perlu disalin pengguna, yang terbaik adalah mengecualikan karakter yang mungkin sulit dibedakan dari konteks.sumber
Random.new.bytes(9)
n=9 ; SecureRandom.urlsafe_base64(n)[0..n-1]
Jika Anda ingin string dengan panjang tertentu, gunakan:
Ini akan menghasilkan string acak yang
2n
berisi panjang0-9
dana-f
sumber
n
, itu benar-benar menghasilkan string yang 4/3 darin
..hex
untuk 2n. Dokumentasi: SecureRandom.hex menghasilkan string heksadesimal acak. Argumen n menentukan panjang, dalam byte, dari nomor acak yang akan dihasilkan. Panjang string heksadesimal yang dihasilkan adalah dua kali dari n .Array.new(n){[*"0".."9"].sample}.join
,n=8
di mana dalam kasus Anda.Umum:,
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
dll.Dari: " Hasilkan string pseudo acak AZ, 0-9 ".
sumber
sumber
Berikut ini adalah satu baris kode sederhana untuk string acak dengan panjang 8:
Anda juga dapat menggunakannya untuk kata sandi acak yang panjangnya 8:
sumber
P(36, 8) / 36^8 = 0.4
ruang karakter yang dimungkinkan untuk 8 karakter (~ 2x lebih mudah untuk memaksa) atauP(36, 25) / 36^25 = 0.00001
dari ruang karakter yang mungkin untuk 25 karakter (~ 100.000x lebih mudah untuk memaksa).Ruby 1.9+:
sumber
map
solusi adalah benar-benar bagus!#sample
berapa banyak elemen yang Anda inginkan. MisalnyaALPHABET.sample(10).join
... ruby-doc.org/core-2.4.0/Array.html#method-i-samplesample(10)
memberi Anda 10 sampel unik. Tapi Anda ingin mereka mengulanginya. Tapi saya akan gunakanArray.new(10).map
untuk kinerjaArray.new
sintaks bloknya.Array.new(20) { [*'0'..'9', *'a'..'z', *'A'..'Z'].sample }.join
Waspada:
rand
dapat diprediksi untuk penyerang dan karena itu mungkin tidak aman. Anda harus menggunakan SecureRandom jika ini untuk menghasilkan kata sandi. Saya menggunakan sesuatu seperti ini:sumber
Berikut adalah satu kode sederhana untuk kata sandi acak dengan panjang 8:
sumber
Metode lain yang saya suka gunakan:
Tambahkan
ljust
jika Anda benar-benar paranoid tentang panjang string yang benar:sumber
Sesuatu dari Rancangan
sumber
.tr('+/=lIO0', 'pqrsxyz')
?Saya pikir ini adalah keseimbangan yang baik antara keringkasan, kejelasan, dan kemudahan modifikasi.
Mudah dimodifikasi
Misalnya, termasuk digit:
Heksadesimal huruf besar:
Untuk serangkaian karakter yang benar-benar mengesankan:
sumber
Cukup tambahkan sen saya di sini ...
sumber
rand
Anda dapat menggunakan
String#random
dari Aspek Ruby Gemfacets
.Ini pada dasarnya melakukan ini:
sumber
Favorit saya adalah
(:A..:Z).to_a.shuffle[0,8].join
. Perhatikan bahwa shuffle memerlukan Ruby> 1.9.sumber
Solusi ini membutuhkan ketergantungan eksternal, tetapi tampaknya lebih cantik daripada yang lain.
Faker::Lorem.characters(10) # => "ang9cbhoa8"
sumber
Diberikan:
Ekspresi tunggal, dapat disampaikan sebagai argumen, memungkinkan karakter duplikat:
sumber
Saya suka jawaban Radar, sejauh ini, saya pikir. Saya akan mengubah sedikit seperti ini:
sumber
(CHARS*length).sample(length).join
?CHARS=['a','b']
metode Anda menghasilkan"aa"
atau"bb"
hanya 33% dari waktu, tetapi"ab"
atau"ba"
67% dari waktu. Mungkin itu bukan masalah, tapi perlu diingat!sumber
2 sen saya:
sumber
Saya hanya menulis permata kecil
random_token
untuk menghasilkan token acak untuk sebagian besar kasus penggunaan, selamat menikmati ~https://github.com/sibevin/random_token
sumber
2 solusi untuk string acak yang terdiri dari 3 rentang:
Satu Karakter dari masing-masing Rentang.
Dan jika Anda memerlukan setidaknya satu karakter dari setiap rentang, seperti membuat kata sandi acak yang memiliki satu huruf besar, satu huruf kecil dan satu digit, Anda dapat melakukan sesuatu seperti ini:
sumber
( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) + [ "%", "!", "*" ].sample(8) ).shuffle.join #=> "Kc5zOGtM0*H796QgPp%!8u2Sxo1"
Saya melakukan sesuatu seperti ini baru-baru ini untuk menghasilkan string acak 8 byte dari 62 karakter. Karakternya 0-9, az, AZ. Saya memiliki array seperti looping 8 kali dan memilih nilai acak dari array. Ini ada di dalam aplikasi Rails.
Yang aneh adalah saya mendapat duplikat dalam jumlah yang banyak. Sekarang secara acak ini seharusnya tidak pernah terjadi. 62 ^ 8 sangat besar, tetapi dari 1.200 kode di db saya punya banyak duplikat. Saya perhatikan mereka terjadi pada batas jam satu sama lain. Dengan kata lain saya mungkin melihat duple pada 12:12:23 dan 2:12:22 atau sesuatu seperti itu ... tidak yakin apakah waktu adalah masalah atau tidak.
Kode ini di sebelum membuat objek ActiveRecord. Sebelum catatan dibuat, kode ini akan menjalankan dan menghasilkan kode 'unik'. Entri dalam DB selalu diproduksi dengan andal, tetapi kode (
str
pada baris di atas) terlalu sering diduplikasi.Saya membuat skrip untuk menjalankan melalui 100000 iterasi baris di atas ini dengan penundaan kecil sehingga akan memakan waktu 3-4 jam berharap untuk melihat semacam pola pengulangan setiap jam, tetapi tidak melihat apa pun. Saya tidak tahu mengapa ini terjadi di aplikasi Rails saya.
sumber