已知一个数据库自增长的INT字段是唯一的,要把这个ID用散列算法映射到一个更大的空间里(比如6位数字),而且对于连续的INT,散列生成的结果离散性要好,比如1=》721370;2=》894357;3=》198222,而不是1=》100000;2=》200000,3=》300000,而且能保证不发生碰撞
|
a591826944May 20, 2014
1
保证不发生碰撞?。。。怎么可能
|
|
2
@a591826944 我从小空间映射到大空间,不发生碰撞是可以的吧
|
|
loadingMay 20, 2014 via Android
3
uuid
|
|
4
uuid如果用数字表示实在是太长了
|
|
loadingMay 20, 2014 via Android
5
你这个id会有几个程序生成?如果是可控的,前面加个前缀不就好了?
|
|
9
这么说吧,就是为了防止别人从ID来判断当前的最大记录,或者通过ID来枚举所有信息
|
|
10
|
|
wdd2007May 20, 2014
12
md5
|
|
kamalMay 20, 2014
13
关注一下,同样有这个需求
|
|
akiraMay 20, 2014
15
自增id后面加个随机数
|
|
18
或者把自增ID的每位数字打散后插入随机数字符串里?
|
|
crabMay 20, 2014
20
当ID超过5位数呢?
|
|
loadingMay 20, 2014 via Android
21
#矫情
|
|
24
最后决定随机数+碰撞处理,就这样吧
|
|
feikeqMay 20, 2014
25
你可以试试用时间戳....
|
|
guorueiMay 20, 2014
28
时间戳+自定义ID,再来个按队列处理,妥妥的。
|
|
ganxiyunMay 20, 2014
29
RC2 64bits输出
|
|
31
|
|
34
skip32
|
|
lu18887May 20, 2014
35
只有时间是唯一的!过了这一刻就不会再来了!所以,好好利用时间来避开碰撞。另外,随机的度不控制好就容易出现碰撞!每一个时间都是平行时空!
|
|
lu18887May 20, 2014
36
时间+自增ID+不可逆算法
|
|
clippitMay 20, 2014
38
数字长一点没关系,加到 URL 里可以把它转换成36进制(a-z0-9)甚至62进制(A-Za-z0-9),这样就短了
|
|
aiskMay 20, 2014
39
@tabris17 http://meizhi.im/ 现在数据库还是存的自增,显示出来的是skip32+base36,应该和你的需求一致
|
|
banxi1988May 21, 2014
40
找一个在第一象限单调递增的函数。把现在人id看成X
Y=func(x),这样的Y就是你要的新的id. |
|
hedaodeMay 21, 2014
43
可以把id简单加密(对称)下,这样既能保证id无明显规律,又能保持唯一性。例如:
id=htonl(id);//颠倒字节顺序 id=id^0x3f91b217;//异或加密,密码自定义 |