如何在 Ruby 中生成唯一的六位字母数字代码

发布于 2024-11-05 04:27:00 字数 47 浏览 0 评论 0原文

我需要生成一个唯一的六位字母数字代码。在我的数据库中保存为每笔交易的凭证编号:。

I need to generate a unique six digit alpha-numeric code. To save in my database as voucher no: for every transaction.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

∝单色的世界 2024-11-12 04:27:00

我使用了这个

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

如何在 Ruby 中生成随机字符串 这个链接很有用

I used this

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

How to generate a random string in Ruby This link was useful

撧情箌佬 2024-11-12 04:27:00

更好的方法是让数据库处理 ids(递增)。但如果您坚持自己生成它们,您可以使用随机生成器生成代码,并根据数据库检查其唯一性。然后接受或重新生成

A better way is to let the database handle the ids(incrementing). But if you insisting on generating them your self, you can use a random generator to generate an code, check it against db for uniqueness. then either accept or regenerate

金橙橙 2024-11-12 04:27:00

我会使用数据库来生成唯一的密钥,但如果您坚持以困难的方式这样做:

class AlnumKey

  def initialize
    @chars = ('0' .. '9').to_a + ('a' .. 'z').to_a
  end

  def to_int(key)
    i = 0
    key.each_char do |ch|
      i = i * @chars.length + @chars.index(ch)
    end
    i
  end

  def to_key(i)
    s = ""
    while i > 0 
      s += @chars[i % @chars.length]
      i /= @chars.length
    end
    s.reverse 
  end

  def next_key(last_key)
    to_key(to_int(last_key) + 1) 
  end
end

al = AlnumKey.new
puts al.next_key("ab")
puts al.next_key("1")
puts al.next_key("zz")

当然,您必须将当前的密钥存储在某个地方,这绝不是线程/多会话安全的等。

I'd use the database to generate unique keys, but if you insist on doing it the hard way:

class AlnumKey

  def initialize
    @chars = ('0' .. '9').to_a + ('a' .. 'z').to_a
  end

  def to_int(key)
    i = 0
    key.each_char do |ch|
      i = i * @chars.length + @chars.index(ch)
    end
    i
  end

  def to_key(i)
    s = ""
    while i > 0 
      s += @chars[i % @chars.length]
      i /= @chars.length
    end
    s.reverse 
  end

  def next_key(last_key)
    to_key(to_int(last_key) + 1) 
  end
end

al = AlnumKey.new
puts al.next_key("ab")
puts al.next_key("1")
puts al.next_key("zz")

Of course, you'll have to store your current key somewhere, and this is in no way thread / multisession-safe etc.

少女七分熟 2024-11-12 04:27:00

具有以下限制:

  1. 有效期仅到 2038-12-24 00:40:35 UTC
  2. 每秒内生成不超过一次

您可以使用以下简单代码:

Time.now.to_i.to_s(36)
# => "lks3bn"

With the following restrictions:

  1. Valid only until 2038-12-24 00:40:35 UTC
  2. Generates no more than once within a second

you can use this simple code:

Time.now.to_i.to_s(36)
# => "lks3bn"
梦断已成空 2024-11-12 04:27:00
class IDSequence
  attr_reader :current
  def initialize(start=0,digits=6,base=36)
    @id, @chars, @base = start, digits, base
  end
  def next
    s = (@id+=1).to_s(@base)
    @current = "0"*(@chars-s.length) << s
  end
end

id = IDSequence.new
1234.times{ id.next }

puts id.current
#=> 0000ya

puts id.next
#=> 0000yb

9876543.times{ id.next }
puts id.current
#=> 05vpqq
class IDSequence
  attr_reader :current
  def initialize(start=0,digits=6,base=36)
    @id, @chars, @base = start, digits, base
  end
  def next
    s = (@id+=1).to_s(@base)
    @current = "0"*(@chars-s.length) << s
  end
end

id = IDSequence.new
1234.times{ id.next }

puts id.current
#=> 0000ya

puts id.next
#=> 0000yb

9876543.times{ id.next }
puts id.current
#=> 05vpqq
街角迷惘 2024-11-12 04:27:00

这将通过获取毫秒来缓解时间冲突问题

(Time.now.to_f*1000.0).to_i

This would eleviate the time collision issue by getting the milli seconds

(Time.now.to_f*1000.0).to_i
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文