php 如何实现尽可能短的唯一 id

2014-10-10 10:45:45 +08:00
 cdffh
目前的实现方法为
md5(uniqid ( time (), true )) 生成出来有32位.因为要做到二维码里面,所以希望尽可能短,系统的数据量不会超过10亿(9位). 问下大家有没有什么比较好的方法.
15076 次点击
所在节点    PHP
40 条回复
tabris17
2014-10-10 10:54:38 +08:00
一个32位整数自增字段,如果要对自增数据保密,可以用skip32算法加密
tabris17
2014-10-10 10:56:25 +08:00
整数再用base64编码
cdffh
2014-10-10 10:56:52 +08:00
@tabris17 自增不合适.因为有多个数据库需要合并的需求 .
cdffh
2014-10-10 10:58:44 +08:00
@tabris17 而且我希望唯一id尽可能短.最好12位能够解决.
tabris17
2014-10-10 10:58:45 +08:00
自增跟数据库没有必然,你不一定要用数据库的自增字段哪
tabris17
2014-10-10 11:00:52 +08:00
我的意思是把32位整数的二进制数据用base64编码,也就是用64进制表示一个整数,6个字符就够了
cdffh
2014-10-10 11:01:18 +08:00
@tabris17 有道理.如果我有两张表存储数据(一个是服务器上的mysql,一个是嵌入式终端里面的sqllite),现在需要合并了. 如何才能保证两边生成的自增id不重复呢? 而且以后可能是多个服务器 多个嵌入式终端 随时都会有同步数据的需求.
qiayue
2014-10-10 11:01:53 +08:00
http://www.zhihu.com/question/19798317/answer/13604187
“它的字符集包括所有128个字符,可容纳多达1850个字符或2710个数字或1108个字节,或500多个汉字”

所以没必要尽可能短吧
cdffh
2014-10-10 11:04:25 +08:00
@qiayue 抱歉 题目没说清楚,因为我们想把二维码做的比较小,所以当数据量大了的时候二维码就会变的比较大,而且经过测试,二维码数据量越小扫描和纠错就相对容易.
qiayue
2014-10-10 11:06:21 +08:00
32 位降到 12 位,也就是省 20 而已啊,省不了多少
换句话说,32 位不长
icyflash
2014-10-10 11:08:53 +08:00
1楼 +1

不算特殊符号,26个字母大小写再加10个数字,总共62个字符。按你的数据量,最短5位,可以参照短网址生成的算法,取6位,再做个KEY-VALUE表。

说话做到二维码里面跟尽量短有什么联系么。。
icyflash
2014-10-10 11:10:29 +08:00
好吧,回复后忘了点回复,回过头来回复后发现LZ已经解释了
tabris17
2014-10-10 11:13:00 +08:00
@cdffh 我不知道你这两套数据库的系统是否是独立的,如果不是独立的,可以使用共享的全局自增整数生成器服务。如果是相互独立的两套系统,可以让一个系统的ID由低往高自增,一个系统的ID由高往低自减。如果是多套独立系统,可以把自增的步进设为系统数目,比如三个系统,系统1是:1、4、7、10……;系统2是:2、5、8、11……;系统3是:3、6、9、12……
tabris17
2014-10-10 11:16:11 +08:00
@cdffh 如果系统数目一开始不确定,可以把每个系统32位整型的自增ID的最高几位设置成系统编号(反正你说9亿数据就够了,32位整数的最高几位也用不到)
cdffh
2014-10-10 11:19:56 +08:00
@qiayue
@icyflash
统一回复下吧 因为需要把id做到二维码里面进行打印 .如果是32位的长度为了保证能够扫描,打印的二维码大小最佳尺寸为180mm*180mm 如果是12位 就可以做的比较小.可以做到100mm*100mm. 因为考虑到打印出来的二维码的应用环境是需要保存5年,而且尺寸不宜过大.,所以我希望在二维码的信息尽可能少.这也就是需要把唯一id尽可能做短的原因.
feiyuanqiu
2014-10-10 11:21:32 +08:00
用大小写字母 (52) + 数字 (10) = 62

>>> 62*62*62*62*62
916132832

只需要5位就能获取到9亿的排列
kisshere
2014-10-10 11:26:08 +08:00
很久以前在一个博客上看到过,uniqid后面加一个random,random取四位吧,如果还撞上了,别去开发二维码,买彩票吧
cdffh
2014-10-10 11:26:54 +08:00
@feiyuanqiu 这是理论值 有没有一个方法能保证生成的id不碰撞呢?
cdffh
2014-10-10 11:27:54 +08:00
@kisshere 这个方案考虑过 被否了 因为公司有撞上过的前辈.
royzheng
2014-10-10 11:28:06 +08:00
如果你考虑多套系统数据库无法共享用到统一的中央ID数据库的话,那么你就只能应用尽可能多的字符来生成随机减少重复率
理论上说吧 52个字母(大小写区分)+10个数字 = 62个
62^12=3.2262668e+21
很长一段时间够用了 等真不够用很多东西要改了。。。不用想着一步到位一下子能容纳上亿什么的

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

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

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

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

© 2021 V2EX