我需要生成一個唯一的六位數字字母數字代碼。將我的數據庫保存爲憑證號:對於每筆交易。如何在Ruby中生成唯一的六位字母數字代碼
回答
我用這個
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,6]
這是一個很有可能發生碰撞的非常糟糕的答案。在100萬次迭代中,215萬個鍵上有767個**千**碰撞。將隨機數從「10000」變爲「10000000」會將碰撞減少到「僅」,在1,000,000中爲31,000,但任何碰撞仍然不好。無論Time.now是否總是相同,或者每次調用返回一個新值(例如,每秒不超過一個事務),情況都是如此。 – Phrogz 2011-05-06 17:25:18
在正常情況下,這是可以接受的。有沒有其他的方式呢。 – rubyprince 2011-05-11 10:20:09
更好的方法是讓數據庫處理ID(遞增)。但是如果你堅持爲自己生成它們,你可以使用一個隨機生成器來生成一個代碼,用db來檢查它的唯一性。然後接受或再生
理論上這是一個壞主意,因爲你開始填充可用的命名空間,因爲碰撞的可能性會增加,並且在極端情況下,最終可能會在找到一個空閒密鑰之前停留在一個很長時間的再生循環中。 – Phrogz 2011-05-06 16:57:12
我會用數據庫生成唯一的密鑰,但如果你堅持這樣做硬盤的方式:
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")
當然,你必須存儲當前的關鍵某個地方,這也是沒有辦法的線程/多區安全等
有以下限制:
- 有效期至2038年12月24日零點40分35秒UTC
- 生成不止一次內的第二
你可以使用這個簡單的代碼:
Time.now.to_i.to_s(36)
# => "lks3bn"
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
這eleviat e通過獲得毫秒來解決時間衝突問題
(Time.now.to_f*1000.0).to_i
- 1. 六位唯一代碼生成
- 2. 如何在MySQL中生成唯一的字母數字內容?
- 3. 如何在Android中生成唯一的10位字母數字值?
- 4. 如何生成20個字符的字母數字唯一ID
- 5. Java程序生成一個唯一的和隨機的六個字母數字代碼
- 6. 生成兩位數字不同的唯一代碼
- 7. 使用數字和字母在php中生成的唯一鍵
- 8. 在C++中生成六位數字
- 9. 實體框架自動增量唯一字母數字代碼生成
- 10. 在NSIS中生成一個10位字母數字字符串
- 11. 生成一個唯一的字母數字ID
- 12. 生成字母數字標識(唯一字符串)
- 13. 從字母數字字符串生成唯一標識
- 14. 自動生成的字母數字的唯一標識與C#
- 15. 生成的字母數字的唯一編號
- 16. 爲唯一字段創建6個字母數字代碼
- 17. 如何從mysql中的AES_ENCRYPT()生成字母數字密碼?
- 18. Java根據文本生成唯一的替代字母數字鍵
- 19. 將唯一的16位數字ID映射到唯一的字母數字ID
- 20. 如何根據唯一整數獲取唯一字母數字
- 21. 如何使用PHP和MYSQL生成唯一的字母數字登錄ID
- 22. 如何在PHP中生成一個唯一的數字範圍
- 23. 加快生成N個唯一隨機數字的代碼
- 24. 通過在字母表中的位置生成字母
- 25. 在Ruby中生成字母數字序列
- 26. 從ruby中的唯一字符串範圍內生成整數
- 27. 生成字母數字代碼的非重複列表
- 28. 生成短的,僞隨機可驗證字母數字代碼
- 29. 如何在MySQL中保存唯一的字母數字內容?
- 30. 基於C#中的唯一字符串生成短代碼
爲什麼你不簡單地自動遞增代碼?然後他們會是數字。如果代碼太多(超過6位數字),則可以使用此編號的Base32編碼,例如 – Jens 2011-05-06 10:49:07
可能重複? http://stackoverflow.com/questions/88311/how-best-to-generate-a-random-string-in-ruby – Teoulas 2011-05-06 10:50:59
@Teoulas我不這麼認爲。在這個問題中沒有任何內容說明代碼需要(或出現)隨機的。 – Phrogz 2011-05-06 17:26:47