Cách tạo một chuỗi ngẫu nhiên trong Ruby


747

Tôi hiện đang tạo một chuỗi chữ hoa giả ngẫu nhiên 8 ký tự cho "A" .. "Z":

value = ""; 8.times{value  << (65 + rand(25)).chr}

nhưng nó không có vẻ rõ ràng và nó không thể được thông qua như là một đối số vì nó không phải là một tuyên bố duy nhất. Để có được chuỗi trường hợp hỗn hợp "a" .. "z" cộng với "A" .. "Z", tôi đã đổi nó thành:

value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}

nhưng nó trông giống như rác rưởi

Có ai có một phương pháp tốt hơn?


Tôi không hiểu tại sao bạn quan tâm rằng "vì đó không phải là một tuyên bố duy nhất nên nó không thể được thông qua như một đối số". Tại sao không chỉ làm cho nó một tiện ích hoặc phương pháp trợ giúp?
David J.

1
Giả sử có một phương pháp để đặt lại mật khẩu của người dùng và nó có một đối số cho mật khẩu mới. Tôi muốn chuyển vào một chuỗi ngẫu nhiên, trong đoạn mã trên tôi cần một biến tmp, trong khi trong các ví dụ câu lệnh đơn dưới đây tôi có thể thực hiện toàn bộ điều này như một lớp lót. Chắc chắn một phương pháp tiện ích có thể tốt trong thời gian dài, đặc biệt nếu tôi cần tương tự ở đây và ở đó, nhưng đôi khi bạn chỉ muốn nó được thực hiện, một lần, được thực hiện.
Jeff

Không, bạn không phải sử dụng một biến tạm thời. Hãy thử điều này: reset_user_password!(random_string)ở đâudef random_string; SecureRandom.urlsafe_base64(20) end
David J.

8 chữ cái là một mật khẩu yếu đáng xấu hổ. Với md5sum, một PC hiện đại có thể khôi phục mật khẩu sau 30 giây . Còn chuyện gì nữasecurerandom.urlsafe_base64
Đại tá Panic

1
Tại sao điều này có rất nhiều câu trả lời? Không phải đó không phải là một câu hỏi hữu ích, nhưng tôi tò mò làm thế nào nó thu hút được sự chú ý.
Lou

Câu trả lời:


970
(0...8).map { (65 + rand(26)).chr }.join

Tôi dành quá nhiều thời gian để chơi golf.

(0...50).map { ('a'..'z').to_a[rand(26)] }.join

Và một điều cuối cùng thậm chí còn khó hiểu hơn, nhưng linh hoạt hơn và lãng phí ít chu kỳ hơn:

o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
string = (0...50).map { o[rand(o.length)] }.join

205
34 ký tự và nhanh chóng : ('a'..'z').to_a.shuffle[0,8].join. Lưu ý bạn sẽ cần Ruby> = 1.9 đến shuffle.
fny

20
Tận dụng các thư viện hiện có là tốt hơn trừ khi bạn có trình điều khiển để tự cuộn. Xem SecureRandomnhư một ví dụ, trong các câu trả lời khác.
David J.

28
@faraz phương thức của bạn không hoạt động giống nhau, nó không ngẫu nhiên với sự thay thế.
michaeltwofish

35
[*('a'..'z'),*('0'..'9')].shuffle[0,8].joinđể tạo một chuỗi ngẫu nhiên có cả chữ và số.
Robin

31
randlà xác định và dự đoán. Đừng sử dụng điều này để tạo mật khẩu! Sử dụng một trong những SecureRandomgiải pháp thay thế.
bút chì

800

Tại sao không sử dụng SecureRandom?

require 'securerandom'
random_string = SecureRandom.hex

# outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81 (i.e. 32 chars of 0..9, a..f)

SecureRandom cũng có các phương thức cho:

  • cơ sở64
  • ngẫu nhiên
  • số ngẫu nhiên

xem: http://ruby-doc.org/stdlib-1.9.2/libdoc/seckerandom/rdoc/SecureRandom.html


11
base64 sẽ, nhưng không phải hex như trong ví dụ của anh ấy
Jeff Dickey

67
Nhân tiện, đây là một phần của stdlib trong phiên bản 1.9 và 1.8 gần đây, vì vậy người ta chỉ có thể có require 'securerandom'được SecureRandomngười trợ giúp gọn gàng này :)
J -_- L

21
BTR SecureRandom đã bị xóa khỏi ActiveSupport trong phiên bản 3.2. Từ thay đổi: "Đã xóa ActiveSupport :: SecureRandom có ​​lợi cho SecureRandom từ thư viện chuẩn".
Marc

15
SecureRandom.random_number(36**12).to_s(36).rjust(12, "0")sẽ tạo một chuỗi có 0-9a-z (36 ký tự) dài LUÔN 12 ký tự. Thay đổi 12 thành bất kỳ độ dài nào bạn muốn. Thật không may, không có cách nào để có được AZ sử dụng Integer#to_s.
Gerry Shaw

1
@ stringo0 đó là sai. Nếu bạn muốn chuyển +fGH1qua một URL, bạn chỉ cần mã hóa URL giống như bạn sẽ BẤT %2BfGH1
K

247

Tôi sử dụng điều này để tạo các chuỗi thân thiện với URL ngẫu nhiên với độ dài tối đa được đảm bảo:

rand(36**length).to_s(36)

Nó tạo ra các chuỗi ngẫu nhiên của chữ thường az và 0-9. Nó không phải là rất tùy biến nhưng nó ngắn và sạch sẽ.


4
+1 cho phiên bản ngắn nhất (không gọi nhị phân bên ngoài ^^). Nếu chuỗi ngẫu nhiên không phải đối mặt công khai, đôi khi tôi thậm chí chỉ sử dụng rand.to_s; xấu, nhưng làm việc
Jo Liss

12
Đây là một giải pháp tuyệt vời (và nhanh chóng, quá), nhưng nó sẽ thường xuyên tạo ra một chuỗi dưới length chiều dài, khoảng một lần trong ~ 40
Brian E

7
@Brian E điều này sẽ đảm bảo các chữ số bạn muốn : (36**(length-1) + rand(36**length)).to_s(36). 36 ** (length-1) được chuyển đổi thành cơ sở 36 là 10 ** (length-1), là giá trị nhỏ nhất có độ dài chữ số bạn muốn.
Eric Hu

11
Đây là phiên bản luôn tạo ra các mã thông báo có độ dài mong muốn:(36**(length-1) + rand(36**length - 36**(length-1))).to_s(36)
Adrien Jarthon

3
Điều này tạo ra lỗi cho tôi trong Rails 4 và Ruby 2.1.1: NameError: undefined local variable or method length 'cho main: Object`
kakubei

175

Giải pháp này tạo ra một chuỗi các ký tự dễ đọc cho mã kích hoạt; Tôi không muốn mọi người nhầm lẫn 8 với B, 1 với I, 0 với O, L với 1, v.v.

# Generates a random string from a set of easily readable characters
def generate_activation_code(size = 6)
  charset = %w{ 2 3 4 6 7 9 A C D E F G H J K M N P Q R T V W X Y Z}
  (0...size).map{ charset.to_a[rand(charset.size)] }.join
end

3
Là "U" mơ hồ hay đó là một lỗi đánh máy?
gtd

10
@gtd - Đúng. U và V là ambigvovs.
colinm

1
@colinm V ở đó mặc dù.
gtd

8
Để được an toàn, bạn cũng sẽ muốn sử dụng SecureRandom.random_number(charset.size)thay vìrand(charset.size)
gtd

1
Tôi chỉ cố gắng cải thiện điều này, bằng cách thêm chữ thường và / hoặc một số ký tự đặc biệt (shift + num) và có các danh sách sau: %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 ! @ # $ % ^ & * +}%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 ! @ # $ % ^ & * }(danh sách đầu tiên không bao gồm chữ thường, nhưng nó dài hơn) làm việc ra
dkniffin

130

Những người khác đã đề cập đến một cái gì đó tương tự, nhưng điều này sử dụng chức năng an toàn URL.

require 'securerandom'
p SecureRandom.urlsafe_base64(5) #=> "UtM7aa8"
p SecureRandom.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg"
p SecureRandom.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ=="

Kết quả có thể chứa AZ, az, 0-9, ăn - và và _ _. Cấm = cũng được sử dụng nếu đệm là đúng.


Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn!
Dan Williams

69

Kể từ Ruby 2.5, thật dễ dàng với SecureRandom.alphanumeric:

len = 8
SecureRandom.alphanumeric(len)
=> "larHSsgL"

Nó tạo ra các chuỗi ngẫu nhiên chứa AZ, az và 0-9 và do đó nên được áp dụng trong hầu hết các trường hợp sử dụng. Và chúng được tạo ra an toàn ngẫu nhiên, cũng có thể là một lợi ích.


Đây là một điểm chuẩn để so sánh nó với giải pháp có nhiều upvote nhất:

require 'benchmark'
require 'securerandom'

len = 10
n = 100_000

Benchmark.bm(12) do |x|
  x.report('SecureRandom') { n.times { SecureRandom.alphanumeric(len) } }
  x.report('rand') do
    o = [('a'..'z'), ('A'..'Z'), (0..9)].map(&:to_a).flatten
    n.times { (0...len).map { o[rand(o.length)] }.join }
  end
end

                   user     system      total        real
SecureRandom   0.429442   0.002746   0.432188 (  0.432705)
rand           0.306650   0.000716   0.307366 (  0.307745)

Vì vậy, randgiải pháp chỉ mất khoảng 3/4 thời gian SecureRandom. Điều đó có thể quan trọng nếu bạn tạo ra nhiều chuỗi, nhưng nếu thỉnh thoảng bạn chỉ tạo một số chuỗi ngẫu nhiên, tôi sẽ luôn luôn thực hiện an toàn hơn vì nó cũng dễ gọi hơn và rõ ràng hơn.


48
[*('A'..'Z')].sample(8).join

Tạo chuỗi 8 chữ cái ngẫu nhiên (ví dụ: NVAYXHGR)

([*('A'..'Z'),*('0'..'9')]-%w(0 1 I O)).sample(8).join

Tạo chuỗi 8 ký tự ngẫu nhiên (ví dụ 3PH4SWF2), loại trừ 0/1 / I / O. Ruby 1.9


4
Chỉ có vấn đề là mỗi nhân vật trong kết quả là duy nhất. Giới hạn các giá trị có thể.
tybro0103

1
Nếu yêu cầu tính năng này được thực hiện, Ruby 1.9.x có thể kết thúc bằng #sample để lấy mẫu mà không cần thay thế và #choice để lấy mẫu với sự thay thế.
David J.

Đây là một lỗi, tôi nghĩ bạn cần ... [*("A".."Z")]'; ((không phải là một lần duy nhất))
jayunit100

bạn có thể cho tôi biết làm thế nào tôi có thể stubnày cho rspecđể vượt qua.
Sinscary

31

Tôi không thể nhớ nơi tôi tìm thấy cái này, nhưng có vẻ như là thứ tốt nhất và ít quy trình nhất đối với tôi:

def random_string(length=10)
  chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
  password = ''
  length.times { password << chars[rand(chars.size)] }
  password
end

7
Có lẽ bạn tìm thấy nó ở đây? travisonrails.com/2007/06/07/generate-random-text-with-ruby
deadwards

Không có 0 và 1 bị thiếu trong số này sao?
sunnyrjuneja 16/03/13

Hình như đó có thể là nơi tôi tìm thấy nó.
Travis Reeder 17/03/13

Và ya, có vẻ như 0 và 1 bị thiếu.
Travis Reeder 17/03/13

4
Các 01OI được cố tình mất tích vì những nhân vật mơ hồ. Nếu loại mã này đang được sử dụng để tạo một tập hợp các ký tự mà người dùng cần sao chép, tốt nhất là loại trừ các ký tự có thể khó phân biệt ra khỏi ngữ cảnh.
Andrew

28
require 'securerandom'
SecureRandom.urlsafe_base64(9)

SecureRandom là một lib tuyệt vời. Tôi không biết nó ở đó. Cảm ơn.
Dogweather

thay thế skool cũ (và xấu hơn):Random.new.bytes(9)
trì hoãn

4
btw, urlsafe_base64 trả về một chuỗi khoảng 4/3 độ dài được chỉ định. Để có được một chuỗi chính xác n ký tự dài, hãy thửn=9 ; SecureRandom.urlsafe_base64(n)[0..n-1]
tardate

25

Nếu bạn muốn một chuỗi có độ dài được chỉ định, hãy sử dụng:

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

Nó sẽ tạo ra một chuỗi chiều dài ngẫu nhiên 2ncó chứa 0-9a-f


Nó không tạo ra một chuỗi độ dài n, nó thực sự tạo ra một chuỗi 4/3 n.
Omar Ali

@OmarAli bạn sai rồi. Theo tài liệu của Ruby trong trường hợp .hexlà 2n. Tài liệu: SecureRandom.hex tạo ra một chuỗi thập lục phân ngẫu nhiên. Đối số n chỉ định độ dài, tính bằng byte, của số ngẫu nhiên được tạo. Độ dài của chuỗi thập lục phân kết quả là hai lần n .
Rihards


11
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,8]

Thú vị, nhưng đắt hơn một chút về mặt tính toán
Jeff

Cũng không có khả năng cho phạm vi giới hạn của các nhân vật.
Kent Fredric

3
Hãy nhớ rằng một bản tóm tắt hex chỉ trả về 0-9 và ký tự af.
webmat

11

Đây là một dòng mã đơn giản cho chuỗi ngẫu nhiên có độ dài 8:

 random_string = ('0'..'z').to_a.shuffle.first(8).join

Bạn cũng có thể sử dụng nó cho mật khẩu ngẫu nhiên có độ dài 8:

random_password = ('0'..'z').to_a.shuffle.first(8).join

2
Bạn không nên sử dụng điều này để tạo cho mình một mật khẩu, vì phương pháp này sẽ không bao giờ lặp lại một ký tự. Do đó, bạn chỉ sử dụng P(36, 8) / 36^8 = 0.4không gian ký tự có thể cho 8 ký tự (~ gấp 2 lần lực lượng vũ trang) hoặc P(36, 25) / 36^25 = 0.00001không gian ký tự có thể cho 25 ký tự (~ 100.000 lần dễ dàng hơn đối với lực lượng vũ trang).
Glacials

10

Ruby 1.9+:

ALPHABET = ('a'..'z').to_a
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

10.times.map { ALPHABET.sample }.join
#=> "stkbssowre"

# or

10.times.inject('') { |s| s + ALPHABET.sample }
#=> "fdgvacnxhc"

1
Các mapgiải pháp thực sự tốt đẹp!
Misha Moroshko

Bạn có thể hỏi có #samplebao nhiêu yếu tố bạn muốn. Ví dụ như ALPHABET.sample(10).join... ruby-doc.org/core-2.4.0/Array.html#method-i-sample
odlp

Điều đó thực sự sai. sample(10)cung cấp cho bạn 10 mẫu độc đáo. Nhưng bạn muốn cho phép họ lặp lại. Nhưng tôi sẽ sử dụng Array.new(10).mapcho hiệu suất
Saša Zejnilović

Tôi muốn chữ và số với cả chữ thường và chữ hoa. Tôi cũng đã chuyển sang sử dụng Array.newvà cú pháp khối của nó. Array.new(20) { [*'0'..'9', *'a'..'z', *'A'..'Z'].sample }.join
taylorthurlow

8

Hãy nhận biết: randcó thể dự đoán được cho một kẻ tấn công và do đó có thể không an toàn. Bạn chắc chắn nên sử dụng SecureRandom nếu điều này là để tạo mật khẩu. Tôi sử dụng một cái gì đó như thế này:

length = 10
characters = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a

password = SecureRandom.random_bytes(length).each_char.map do |char|
  characters[(char.ord % characters.length)]
end.join

Đây có lẽ là giải pháp an toàn "nhất". SecureRandom cố gắng sử dụng các API bảo mật cơ bản do hệ điều hành cung cấp. Nếu bạn có OpenSSL, nó sẽ sử dụng nó, nếu bạn ở trên Windows, nó sẽ là lựa chọn tốt nhất ở đó. Tôi đặc biệt thích giải pháp này vì nó cho phép bạn chỉ định một bộ ký tự để sử dụng. Mặc dù nó sẽ không hoạt động nếu bộ ký tự của bạn dài hơn giá trị tối đa của một byte: 255. Tôi khuyên bạn nên xem mã nguồn cho SecureRandom trong tài liệu: ruby-doc.org/stdlib-1.9.3/libdoc/seckerandom/ ndoc / đào
Giống như

8

Đây là một mã đơn giản cho mật khẩu ngẫu nhiên có độ dài 8:

rand_password=('0'..'z').to_a.shuffle.first(8).join

7

Một phương pháp khác tôi muốn sử dụng:

 rand(2**256).to_s(36)[0..7]

Thêm ljustnếu bạn thực sự hoang tưởng về độ dài chuỗi chính xác:

 rand(2**256).to_s(36).ljust(8,'a')[0..7]

Thậm chí tốt hơn để lấy phần ít nhất của số ngẫu nhiên bằng cách sử dụng phía bên phải của chuỗi: rand (2 ** 64) .to_s (36) [- 10,10]
Jeff

6
SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')

Một cái gì đó từ Devise


Tại sao nó thay thế các ký tự chuỗi bằng cách sử dụng .tr('+/=lIO0', 'pqrsxyz')?
Miguelcobain

Các ký tự đặc biệt vì chúng không an toàn URL. Và l / I hoặc O / 0 vì chúng rất dễ bị nhầm lẫn nếu bạn sử dụng kỹ thuật để tạo mật khẩu người dùng có thể đọc được.
ToniTornado

Hàm đó có một chút sai lệch đối với các ký tự nhất định. Ngoài ra, đối với các độ dài khác (ví dụ 16), ký tự cuối cùng sẽ không ngẫu nhiên. Đây là một cách để tránh điều đó. SecureRandom.base64 (64) .tr ('+ / = lIO01', '') [0,16]
Shai Coleman

5

Tôi nghĩ rằng đây là một sự cân bằng tốt đẹp của sự đồng nhất, rõ ràng và dễ sửa đổi.

characters = ('a'..'z').to_a + ('A'..'Z').to_a
# Prior to 1.9, use .choice, not .sample
(0..8).map{characters.sample}.join

Dễ dàng sửa đổi

Ví dụ: bao gồm các chữ số:

characters = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a

Hệ thập lục phân:

characters = ('A'..'F').to_a + (0..9).to_a

Đối với một loạt các nhân vật thực sự ấn tượng:

characters = (32..126).to_a.pack('U*').chars.to_a

1
tôi muốn giới thiệu điều này chỉ sử dụng chữ in hoa + số, đồng thời xóa ký tự "khó hiểu" = (1..9) .to_a.concat (('A' .. 'Z'). to_a) .reject {| a | [0, 1, 'O', 'I']. Bao gồm? (A)} (0 ... kích thước) .map {charset [rand (charset.size)]} .join
luster

5

Chỉ cần thêm xu của tôi vào đây ...

def random_string(length = 8)
  rand(32**length).to_s(32)
end

3
NB: điều này không phải lúc nào cũng trả về một chuỗi chính xác + độ dài + dài - nó có thể ngắn hơn. Nó phụ thuộc vào số được trả về bởirand
tardate

5

Bạn có thể sử dụng String#randomtừ Facets of Ruby Gemfacets .

Về cơ bản nó làm điều này:

class String
  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    characters = character_set.map { |i| i.to_a }.flatten
    characters_len = characters.length
    (0...len).map{ characters[rand(characters_len)] }.join
  end
end

4

Yêu thích của tôi là (:A..:Z).to_a.shuffle[0,8].join. Lưu ý rằng shuffle yêu cầu Ruby> 1.9.


4

Giải pháp này cần sự phụ thuộc bên ngoài, nhưng có vẻ đẹp hơn giải pháp khác.

  1. Cài đặt viên ngọc kẻ giả mạo
  2. Faker::Lorem.characters(10) # => "ang9cbhoa8"

4

Được:

chars = [*('a'..'z'),*('0'..'9')].flatten

Biểu thức đơn, có thể được truyền dưới dạng đối số, cho phép các ký tự trùng lặp:

Array.new(len) { chars.sample }.join

3

Tôi thích câu trả lời của Radar nhất, cho đến nay, tôi nghĩ vậy. Tôi muốn chỉnh sửa một chút như thế này:

CHARS = ('a'..'z').to_a + ('A'..'Z').to_a
def rand_string(length=8)
  s=''
  length.times{ s << CHARS[rand(CHARS.length)] }
  s
end

Tại sao không sử dụng (CHARS*length).sample(length).join?
cháu gái

@niels Đề xuất này sẽ tạo ra một chuỗi có trọng số , có lợi cho các ký tự không lặp lại. Ví dụ: nếu CHARS=['a','b']sau đó phương thức của bạn sẽ tạo "aa"hoặc "bb"chỉ 33% thời gian, nhưng "ab"hoặc "ba"67% thời gian. Có lẽ đó không phải là vấn đề, nhưng nó đáng để lưu tâm!
Tom Lord

thật tốt, @TomLord, tôi nghĩ rằng tôi đã không thực sự nhận ra rằng khi tôi đăng đề xuất đó (mặc dù tôi phải thừa nhận rằng tôi không nhớ rằng mình đã đăng bài đó: D)
niels 19/12/17

3
''.tap {|v| 4.times { v << ('a'..'z').to_a.sample} }

3

2 xu của tôi:

  def token(length=16)
    chars = [*('A'..'Z'), *('a'..'z'), *(0..9)]
    (0..length).map {chars.sample}.join
  end


3

2 giải pháp cho một chuỗi ngẫu nhiên bao gồm 3 phạm vi:

(('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a).sample(8).join

([*(48..57),*(65..90),*(97..122)]).sample(8).collect(&:chr)*""

Một nhân vật từ mỗi Phạm vi.

Và nếu bạn cần ít nhất một ký tự từ mỗi phạm vi, chẳng hạn như tạo mật khẩu ngẫu nhiên có một chữ hoa, một chữ cái viết thường và một chữ số, bạn có thể làm một cái gì đó như thế này:

( ('a'..'z').to_a.sample(8) + ('A'..'Z').to_a.sample(8) + (0..9).to_a.sample(8) ).shuffle.join 
#=> "Kc5zOGtM0H796QgPp8u2Sxo1"

Và nếu bạn muốn thực thi một số lượng nhất định của mỗi phạm vi, bạn có thể làm một cái gì đó như thế này:( ('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"
Joshua Pinter

3

Tôi đã làm một cái gì đó như thế này gần đây để tạo ra một chuỗi ngẫu nhiên 8 byte từ 62 ký tự. Các ký tự là 0-9, az, AZ. Tôi đã có một mảng trong số chúng như được lặp 8 lần và chọn một giá trị ngẫu nhiên trong mảng. Đây là một ứng dụng Rails.

str = ''
8.times {|i| str << ARRAY_OF_POSSIBLE_VALUES[rand(SIZE_OF_ARRAY_OF_POSSIBLE_VALUES)] }

Điều kỳ lạ là tôi có số lượng bản sao tốt. Bây giờ ngẫu nhiên điều này sẽ không bao giờ xảy ra. 62 ^ 8 là rất lớn, nhưng trong số 1200 hoặc hơn mã trong db tôi đã có một số lượng trùng lặp tốt. Tôi nhận thấy chúng xảy ra trên ranh giới giờ của nhau. Nói cách khác, tôi có thể thấy một bản sao vào lúc 12:12:23 và 2:12:22 hoặc đại loại như thế ... không chắc thời gian có phải là vấn đề hay không.

Mã này đã được tạo trước khi tạo đối tượng ActiveRecord. Trước khi bản ghi được tạo, mã này sẽ chạy và tạo mã 'duy nhất'. Các mục trong DB luôn được sản xuất một cách đáng tin cậy, nhưng mã ( strtrong dòng trên) đã được sao chép quá thường xuyên.

Tôi đã tạo một tập lệnh để chạy qua 100000 lần lặp của dòng trên với độ trễ nhỏ, do đó, sẽ mất 3-4 giờ với hy vọng sẽ thấy một kiểu mẫu lặp lại trên cơ sở hàng giờ, nhưng không thấy gì. Tôi không biết tại sao điều này lại xảy ra trong ứng dụng Rails của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.