V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
domino
V2EX  ›  PHP

不重复的 10 位数的订单 ID

  •  
  •   domino · 2014-10-31 12:23:02 +08:00 · 9507 次点击
    这是一个创建于 3655 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如何不重复的10位数的订单 ID

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

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

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

    order_id = encrypt(secret_key, serial_id)

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

    serial_id = decrypt(secret_key, order_id)

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

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

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

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

    id , order_sn, user_id
    ---------------------
    1 ,201411010001 ,123
    2 ,201411010002 ,456
    lowkey
        28
    lowkey  
       2014-11-01 16:47:56 +08:00
    能用字母的话就好办 0-9 加上 a-z 加上A-Z 变成 62进制
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2564 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:20 · PVG 19:20 · LAX 04:20 · JFK 07:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.