V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
andybest
V2EX  ›  问与答

怎样隐藏数字ID比较方便?

  •  
  •   andybest · 2013-04-09 21:36:49 +08:00 · 3986 次点击
    这是一个创建于 4251 天前的主题,其中的信息可能已经有所发展或是发生改变。
    要发给用户一个URL用于显示订单状态,例如:
    http://url/order.php?id=123

    我不想让用户知道订单号123,想最好是这样的:
    http://url/order.php?id=0605cb78

    然后我后台能用0605cb78反解析出数字id 123,然后我再去用123查工单状态

    有什么简单并且高效的算法可以实现?(这个感觉没必要上RSA这样的,保密级别没这么高)
    15 条回复    1970-01-01 08:00:00 +08:00
    CoX
        1
    CoX  
       2013-04-09 21:44:48 +08:00
    再搞个字段就行了,订单号可以自己组合,比如日期再加几个随机数字 ex:2013040921460101
    qiuai
        2
    qiuai  
       2013-04-09 21:48:53 +08:00   ❤️ 1
    1=>a,2=>b....
    0x0001
        3
    0x0001  
       2013-04-09 21:49:09 +08:00
    我会使用生成时刻的timestamp进行处理,如截取几位,再加上id号,毕竟订单生成时刻应该是必存的。
    Air_Mu
        4
    Air_Mu  
       2013-04-09 21:50:33 +08:00
    多搞一个字段做查询
    Js
        5
    Js  
       2013-04-09 21:59:54 +08:00
    简单点就是随便弄个数字做异或, 再base32/base62/base64一下算了
    andybest
        6
    andybest  
    OP
       2013-04-09 22:00:56 +08:00
    @CoX @0x0001 @Air_Mu 为了这个小需求多增加一个字段感觉不值得

    @qiuai 感谢,这个方法不错。。但是有点太简单了,比如如果给用户一个
    /order.php?id=a
    这似乎就暴露了什么。。。
    andybest
        7
    andybest  
    OP
       2013-04-09 22:01:41 +08:00
    @Js 请问怎么"随便弄个数字做异或"? 谢谢!
    Js
        8
    Js  
       2013-04-09 22:05:41 +08:00   ❤️ 1
    @andybest

    irb(main):001:0> XOR_NUM = 123321
    => 123321
    irb(main):002:0> code = (123 ^ XOR_NUM).to_s 32
    => "3oe2"
    irb(main):003:0> (code.to_i 32) ^ XOR_NUM
    => 123
    qiuai
        9
    qiuai  
       2013-04-10 12:21:27 +08:00
    @andybest 因为你还要进行反解,所以建立字典是最快的办法.
    qdcanyun
        10
    qdcanyun  
       2013-04-10 17:00:26 +08:00
    基本思想就是产生一个无序字符串
    然后做字典对应让每个无序串真实id
    virushuo
        11
    virushuo  
       2013-04-10 17:04:45 +08:00   ❤️ 1
    类似于做短网址的方法,你转换这个数字到一个新的数制,比如62进制(考虑到url字符安全,62进制比较常用),然后创建一个62位长的码表,做映射。这样就转成了一个数字+字母的ID。

    反转回来的时候别人不知道你的码表顺序,只拿一个id不太容易反算回去。当然如果非要算也能算出来,收集几个连续id就算出来了。但你这也不是为了加密,被猜出来也无所谓。

    参考:

    http://stackoverflow.com/questions/4728855/please-explain-this-base-62-php-conversion-function-algorithm
    Livid
        12
    Livid  
    MOD
       2013-04-10 17:05:48 +08:00
    import uuid

    uuid.uuid1()
    cutehalo
        13
    cutehalo  
       2013-04-10 17:05:49 +08:00
    可以用一些不常用的进制转换 什么17进制 63进制的...
    Livid
        14
    Livid  
    MOD
       2013-04-10 17:06:15 +08:00
    最好是再加个 UUID 字段。
    andybest
        15
    andybest  
    OP
       2013-04-10 17:42:04 +08:00
    @virushuo 感谢!对我很有用!

    @Livid uuid.uuid1() 这个方法有什么作用?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2834 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:19 · PVG 23:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.