Rails 订单编号是用 ID 自增主键显示的,但这样会暴露订单数量,有什么办法?

jeky · 2015年05月14日 · 最后由 suupic 回复于 2015年05月20日 · 9226 次阅读

我不想暴露订单数量,有什么办法? 是不是应该自定义主键:比如用当前时间 - 固定时间,毫秒差?

时间戳+ID 截断几位?

前缀 - 月-日 - 当前月订单总数(从 0 递增)

@blacktulip 第一个 gem 是不是和 paginate 冲突啊?

1 自定义 Key 2 1 楼

#4 楼 @killernova 那个 gem 只是混淆展示而已,不用真的把 id 变成那样

或者用 uuid 做主键

记得加一个校验码

#1 楼 @blacktulip 第一个东东不错。可逆 hash。其核心是 https://github.com/namick/scatter_swap/blob/master/lib/scatter_swap/hasher.rb

也就是 minimal perfect hash function 算法。

LZ 的问题其实分 2 个层面:

  1. 知道商品总量
  2. 知道商品增量

如果仅仅不想让别人知道商品总量,那么从 10000 + rand() * 1000 开始自增计数不就行了么。。。

想让人不知道商品增量,必须采用离散不冲突的 hash 来解决。

id 改成 uuid 至于显示给用户的订单,可以处理以下。比如时间戳加 uuid 的前几位

我觉得吧。就不要用 id 来作为订单编号了。

id 继续自增,

订单编号改为 uuid

如果数据库不想做任何改变。那就参考 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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号