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