自增的 bigint 就行了,0-9, a-z ,A-Z 是 62........ 最多再加一个 k(hash 后的 url)-v( id ) 库确保 url 唯一
#4 楼 @clearJiang #5 楼 @hooopo 不行啊,这样相当于直接暴露了 id,自增的 id 属于有意义的字段。 转码就是为了把 id 隐藏,否则就不用转了。
#7 楼 @clearJiang 我现在是要隐藏 id。 我的需求与 shorturl 有一点不太一样:我要隐藏的是 user_id,如果向外界暴露自增的 id,可能会被临近值攻击。如我暴露的 user_id=1000,别人就可以尝试 999,1001 攻击。
#13 楼 @huacnlee #5 楼 @hooopo Ruby 的 to_s 支持 Base 2-36。 http://ruby-doc.org/core-1.9.3/Fixnum.html#method-i-to_s
才发现Base
原来就是所谓的进制
after_create {
begin
# 4 bytes => 32 bits => 4,294,967,296 unique values
self.profile_slug = ActiveSupport::SecureRandom.hex(4)
self.save!
rescue ActiveRecord::RecordNotUnique => e
retry
end
}
试试这个 ~。~