我不想暴露订单数量,有什么办法? 是不是应该自定义主键:比如用当前时间 - 固定时间,毫秒差?
#1 楼 @blacktulip 第一个东东不错。可逆 hash。其核心是 https://github.com/namick/scatter_swap/blob/master/lib/scatter_swap/hasher.rb
也就是 minimal perfect hash function 算法。
LZ 的问题其实分 2 个层面:
如果仅仅不想让别人知道商品总量,那么从 10000 + rand() * 1000 开始自增计数不就行了么。。。
想让人不知道商品增量,必须采用离散不冲突的 hash 来解决。
如果数据库不想做任何改变。那就参考 https://github.com/pencil/encrypted_id 这个实现,如果你使用 Rails 4.X 的版本,那么需要自己修改下,或者直接用我改完的 https://github.com/wjp2013/encrypted_id
订单的 model 加多一个 number 字段,作为系统唯一订单号,订单号规则就自己定咯,比如结合日期:20150519000001 或者就是完全打乱 7687289809328762,看你自己需要。
gem 'hashids'
# 加密id做参数
def to_param
encode_id
end
# 加密id
def encode_id
HASH_ID.encode(id)
end
# 解密id
def decode_id
HASH_ID.decode(id)[0]
end
class << self
def find_by_encode_id(encode_id)
id = HASH_ID.decode(encode_id)[0]
find_by(id: id)
end
def find_by_encode_id!(encode_id)
id = HASH_ID.decode(encode_id)[0]
find_by!(id: id)
end
end