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

2013-04-09 21:36:49 +08:00
 andybest
要发给用户一个URL用于显示订单状态,例如:
http://url/order.php?id=123

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

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

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

@qiuai 感谢,这个方法不错。。但是有点太简单了,比如如果给用户一个
/order.php?id=a
这似乎就暴露了什么。。。
andybest
2013-04-09 22:01:41 +08:00
@Js 请问怎么"随便弄个数字做异或"? 谢谢!
Js
2013-04-09 22:05:41 +08:00
@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
2013-04-10 12:21:27 +08:00
@andybest 因为你还要进行反解,所以建立字典是最快的办法.
qdcanyun
2013-04-10 17:00:26 +08:00
基本思想就是产生一个无序字符串
然后做字典对应让每个无序串真实id
virushuo
2013-04-10 17:04:45 +08:00
类似于做短网址的方法,你转换这个数字到一个新的数制,比如62进制(考虑到url字符安全,62进制比较常用),然后创建一个62位长的码表,做映射。这样就转成了一个数字+字母的ID。

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

参考:

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

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

@Livid uuid.uuid1() 这个方法有什么作用?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/65414

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX