andybest
V2EX  ›  问与答

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

  •  
  •   andybest · Apr 9, 2013 · 4802 views
    This topic created in 4800 days ago, the information mentioned may be changed or developed.
    要发给用户一个URL用于显示订单状态,例如:
    http://url/order.php?id=123

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

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

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

    @qiuai 感谢,这个方法不错。。但是有点太简单了,比如如果给用户一个
    /order.php?id=a
    这似乎就暴露了什么。。。
    andybest
        7
    andybest  
    OP
       Apr 9, 2013
    @Js 请问怎么"随便弄个数字做异或"? 谢谢!
    Js
        8
    Js  
       Apr 9, 2013   ❤️ 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  
    PRO
       Apr 10, 2013
    @andybest 因为你还要进行反解,所以建立字典是最快的办法.
    qdcanyun
        10
    qdcanyun  
       Apr 10, 2013
    基本思想就是产生一个无序字符串
    然后做字典对应让每个无序串真实id
    virushuo
        11
    virushuo  
       Apr 10, 2013   ❤️ 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
    PRO
       Apr 10, 2013
    import uuid

    uuid.uuid1()
    cutehalo
        13
    cutehalo  
       Apr 10, 2013
    可以用一些不常用的进制转换 什么17进制 63进制的...
    Livid
        14
    Livid  
    MOD
    PRO
       Apr 10, 2013
    最好是再加个 UUID 字段。
    andybest
        15
    andybest  
    OP
       Apr 10, 2013
    @virushuo 感谢!对我很有用!

    @Livid uuid.uuid1() 这个方法有什么作用?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5564 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 07:06 · PVG 15:06 · LAX 00:06 · JFK 03:06
    ♥ Do have faith in what you're doing.