arrays - 在 Ruby 中生成大量独特的 token

标签 arrays ruby performance set unique

我需要为两个代码列表生成很多唯一的代码,这些代码不能彼此匹配并且是唯一的代码。 它的长度必须是七个字符。

但是我对最终的解决方案并不满意,我不得不整夜运行。

  • 我本来想使用集合(因为集合比数组更快),但我无法像使用数组那样在所选索引处将集合分成两部分。

  • 我希望并行化 token 创建,但这意味着管理共享代码数组以检查唯一性以及涉及的所有锁定问题。

这是我使用的代码:

# n is the token length, quantity the number of tokens I want.
def gen_codes(n=7, quantity=10)
  tokens = []
  quantity.times do |q|
    token = [*('a'..'z'), *('A'..'Z'), *(0..9)].sample(7).join
    while tokens.include?(token)
      token = [*('a'..'z'), *('A'..'Z'), *(0..9)].sample(7).join
    end
    tokens << token
  end
  tokens
end

CODES1 = 750e3.to_i
CODES2 = 250e3.to_i

puts "Generating codes"

codes = gen_codes(7, CODES1+CODES2)
codes2 = codes[0, CODES2]
codes1 = codes[CODES2, CODES1]

File.open('codes1.txt', 'w+') do |f|
  f.puts codes1
end

File.open('codes2.txt', 'w+') do |f|
  f.puts codes2
end

有没有人有更好的解决方案?

最佳答案

这应该有效:

require 'set'

alphabet = [*('a'..'z'), *('A'..'Z'), *(0..9)]

CODES1 = 750_000
CODES2 = 250_000

set = Set.new
set << alphabet.sample(7).join until set.size == CODES1 + CODES2
codes = set.to_a

codes1 = codes[0...CODES1]
codes2 = codes[CODES1..-1]

File.write('codes1.txt', codes1)
File.write('codes2.txt', codes2)

在我的系统上大约需要 4 秒。

关于arrays - 在 Ruby 中生成大量独特的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46234430/

相关文章:

java - 如何将字符串转换为二维字符数组 JAVA

ruby - 检查字符串是否包含数组中的任何子字符串

ruby - 求和哈希值 Ruby

mysql - 对大量数据进行分页

c++ - 节省内存的 C++ 字符串(interning、ropes、copy-on-write 等)

ruby - 何时使用在 Ruby 中启动子进程的每种方法

ruby - 如何替换 block 中的字符串

javascript - 循环 JSON 对象并删除特定的子对象

分配后未更新 C++ 字符串大小

ruby - 在调用上下文中访问局部变量