domino
V2EX  ›  PHP

不重复的 10 位数的订单 ID

  •  
  •   domino · Oct 31, 2014 · 11014 views
    This topic created in 4388 days ago, the information mentioned may be changed or developed.
    如何不重复的10位数的订单 ID

    10个字内,用时间+随机号很像容易碰撞
    28 replies  •  2014-11-01 16:47:56 +08:00
    leyle
    leyle
    Oct 31, 2014❤️1
    1
    这个要看你的业务需求,比如你每日的交易量,一个月的交易量,一年的交易量,是要求永远不重复,还是说一段时间内不重复。
    如果是要求永远不重复,并且每日交易量不大于100 的话,按照 yyyymmdd+两位数字(0~99)

    如果业务在订单号超过 9999999999 之前就不存在了,那就从 0 开始递增。

    否则,你为啥子要把订单号这么敏感的信息设定的长度那么短。
    leyle
    leyle
    Oct 31, 2014
    2
    以前做过的银行里面的订单号,一般是 20 位长, yyyymmdd+12顺序数。
    xuyuanp
    xuyuanp
    Oct 31, 2014
    3
    @leyle 这样不会暴露交易量嘛
    sneezry
    sneezry
    Oct 31, 2014
    4
    时间戳转16进制,位数不够后面补随机数
    jemyzhang
    jemyzhang
    Oct 31, 2014
    5
    @xuyuanp 交易量是用来炫耀的,你怕啥^^
    domino
    domino
    OP
    Oct 31, 2014
    6
    原本是写不重复的,但用到毫秒时间. 客户说太长难记.
    要求要短一点
    ipconfiger
    ipconfiger
    Oct 31, 2014❤️1
    7
    对分布式系统来说,10位的ID很难做到不重复,除非你用自增id
    7654
    7654
    Oct 31, 2014
    8
    两位数年份+两位数月份+两位数周别+4位流水码,这样一周内交易量没有9999肯定不重复的,16进制都用不上
    sc
    sc
    Oct 31, 2014
    9
    加密订单的顺序数(数据库的自增ID),比如,

    order_id = encrypt(secret_key, serial_id)

    通过订单号查询数据库的时候,解密order_id得到serial_id

    serial_id = decrypt(secret_key, order_id)

    至于加密算法应该有很多。
    nomaka
    nomaka
    Oct 31, 2014
    10
    弄张表主键自增啊 yahoo就这么做的貌似
    akstrom
    akstrom
    Oct 31, 2014
    11
    每天多少订单量?以前设计过一个8位数的
    domino
    domino
    OP
    Oct 31, 2014
    12
    做的是报名系统.一个活动约100-200 人.有名额限制.
    报名者一次可填写多人报名资料.希望每笔资料都有一个订单序号.
    一天差不多会有10-20 个活动一起跑.
    chasion
    chasion
    Oct 31, 2014
    13
    就用递增呗,从1000000000
    limbo0
    limbo0
    Oct 31, 2014
    14
    @domino 题主这头像和我github上一样哈,差点看错了
    lygmqkl
    lygmqkl
    Oct 31, 2014
    15
    @ipconfiger 分布式系统只能 自增 或者建立一个表存储上一次的字段,read and ++
    shuson
    shuson
    Oct 31, 2014❤️1
    16
    ren2881971
    ren2881971
    Oct 31, 2014
    17
    用时间戳+随机数啊。
    xuyuanp
    xuyuanp
    Oct 31, 2014
    18
    @jemyzhang 如果比较炫耀不起来呢。。。。
    akstrom
    akstrom
    Oct 31, 2014
    19
    全数字还是可以数字+字母?
    wy315700
    wy315700
    Oct 31, 2014
    20
    short_uuid
    47jm9ozp
    47jm9ozp
    Oct 31, 2014
    21
    那个。。为啥订单号需要记的。。
    domino
    domino
    OP
    Oct 31, 2014
    22
    因为要用订单号码去发送礼物.
    我也认为没人会用头脑记编号.都会用笔抄.
    不过客户就这样坚持.要短才方便他们作业
    staticor
    staticor
    Oct 31, 2014
    23
    时间加uid的增量, 取整数后再加一个简单的数学函数transform.

    (存在反函数能寻原值的)

    比如tan(x) 1/x 之类的..
    Smartype
    Smartype
    Oct 31, 2014
    24
    别想那么复杂,当然也没有那么好的办法。
    1. 自增
    2. 随机数(或者时间戳+随机数)检查是否存在,如果重复就继续生成随机数

    真的没有别的办法。
    rwalle
    rwalle
    Oct 31, 2014 via Android
    25
    如果楼主又要短又要不重复,如果可能的话建议楼主直接改成字母+数字组合。不过还要看具体如何使用,以及是否一定要用数字。
    iam36
    iam36
    Oct 31, 2014 via Android
    26
    Yyyymmddhhmmss xxxxxxxxxx
    X从1开始自然递增,每日复位。
    给苹果公司也够用了
    domino
    domino
    OP
    Nov 1, 2014
    27
    如果用自增量当order_sn,
    是否一定先 insert , 取得 LAST_INSERT_ID后
    在 (yyyymmdd+ id) UPDATE order_sn 呢.
    有办法一句sql 完成吗.

    id , order_sn, user_id
    ---------------------
    1 ,201411010001 ,123
    2 ,201411010002 ,456
    lowkey
    lowkey
    Nov 1, 2014
    28
    能用字母的话就好办 0-9 加上 a-z 加上A-Z 变成 62进制
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2611 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 526ms · UTC 00:29 · PVG 08:29 · LAX 16:29 · JFK 19:29
    ♥ Do have faith in what you're doing.