新手问题 小白有个小想法希望实现一下

coooldfarmer · September 10, 2015 · Last by coooldfarmer replied at September 18, 2015 · 2043 hits

一个 model--->Ex.rb,一个按钮,点击按钮时生成一个地址,再点击按钮生成另一个地址,保证每一个地址都是唯一的,并且都在 Ex 模型下。 或者是类似百度文库的那种提取码,但也需要每次生成个不会重复字段作为特征码。有什么好的想法吗?

试了下 securerandom.hex,生成的内容是会重复的。

require 'securerandom'
a = Array.new
i = 0
times = 0

while true 

    a[i] = SecureRandom.hex(1)
    i = i + 1
    times = times + 1
    p a
    p times
    break if a.uniq! != nil
end

并且生成的每一个页面里保存有一个内容。比如点击按钮,并且提交里面的表单,生成 001 页面。当访问 001 页面时,显示之前在 001 里提交的表单的内容。求大神们给点思路或者引导吧..谢谢

表里放一个 parent_id, 可行

#4 楼 @coooldfarmer 换个方式来想这个问题,加个if, 当出现重复的字符串的时候就重新生成一次 直到不重复 这样就可以了

加时间戳后再加密

#6 楼 @killernova 但不知道加时间戳用什么算法加密,长度要合适,又要保证唯一性。

#5 楼 @raven 哈哈,也是个办法。先看看有没有其他更好的路可以走。

自增字段加随机码 否则你的碰撞概率总会越来越高的

def generate(klass, column)
      key = key_for(column)

      loop do
        raw = Devise.friendly_token
        enc = OpenSSL::HMAC.hexdigest(@digest, key, raw)
        break [raw, enc] unless klass.to_adapter.find_first({ column => enc })
      end
    end

devise 的做法,用个 loop 吧,碰撞了重新生成一个, 你想想啊 hex(1) 才两位,样本总数也才(26+10)**2 = 1296 针对数据量选择样本随机吧!

#10 楼 @colorfulberry 想了个简单方法,直接用时间来映射字母,几个随机数,随机插入映射出来的序列位置。加个权确保平均分布,用 Time.now.nsec 就可以了

You need to Sign in before reply, if you don't have an account, please Sign up first.