分享超级表格的id号的生成规则

浏览:
字体:
发布时间:2013-12-09 23:23:05
来源:

表记录的关键字段(一般取名为id)的值的生成方式,通常有下列几种:

1、数据库自增,即从0开始,每次加1。在记录插入到数据库表时生成;这是mysql数据库的用户最多人的选择。不足之处是在新记录插入数据库前,并不知道它的值;第二个不足是无法在多个表记录间保持id唯一(某些系统会要求这点,这个理解起来有一定困难。)
2、GUID字符串:全局唯一标识符(GUID,Globally Unique Identifier)。GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。GUID一词有时也专指微软对UUID标准的实现。
不足是字段类型必须是字符串,排序和性能都不如数字类型。
3、时间戳:精确到毫秒,意味着当同一个毫秒有多条记录生成时,id就可能重复,导致新记录无法插入。
4、自定义函数

超级表格某些关键表的id的生成,有下列要求:
1、高性能,最好是数字类型,而不是字符串;
2、提前生成(而不是在插入数据库后才生成),即在用户输入页面时就生成;
3、不但要求本表唯一,而且不能与其它表记录的id重复。因为有些公共的表会把来自不同表的记录的id记录在一起。
4、足够低的重复概率,能满足超级表的数量的要求。

为满足这些要求,我们设计了一个简单而实用的timeid的生成方式。
首先用时间函数生成一个包括年、月、日、时、分、秒、毫秒的数字类型的字符串。例如2013年12月3日14时50分12秒345毫秒,对应的字符串是131203145012345。
我们只取年分的最后两位,这样可以节省两位数,而且能满足100年不重复(足够了)。
如果只是这个算法生成的id,万一在同一毫秒生成了多个id,那就重复了。为了继续减少重复概率,我们又加上了从10000到99999之间的一个随机数。
这意味着,在同一时间(精确到毫秒),有10万分之一的重复概率。足够低了,足以满足超级表格的数量级别要求。

timeid除了重复率足够低,因为完全是数字组成,可以存储为数字类型,性能高;而且是按时间先后顺序生成,id基本也是递增的(之所以说是“基本”,因为同一毫秒内的id可能不是递增)。
不足是数字位数达20位,显得稍多,需用double类型存储。

下面就是生成timeid的函数js代码:

//获得时间随机数,从年份的最后2位,到毫秒,最后加5 位随机数,共20位。例如13112918400745636211
function getTimeId()
{
var date1=new Date();
var r="";
r=date1.getFullYear().toString().substring(2);
var d=date1.getMonth()+1;
if (d<10)r+="0"+d;else r+=d;
d=date1.getDate();
if (d<10)r+="0"+d;else r+=d;
d=date1.getHours();
if (d<10)r+="0"+d;else r+=d;
d=date1.getMinutes();
if (d<10)r+="0"+d;else r+=""+d;
d=date1.getSeconds();
if (d<10)r+="0"+d;else r+=""+d;
var d=date1.getMilliseconds();
if (d<10)r+="0"+d;
else
if (d<100)r+="00"+d;
else r+=d;

var x="0123456789";
var tmp="";
for(var i=0;i<5;i++)
tmp+=x.charAt(Math.ceil(Math.random()*100000000)%x.length);
r+=tmp;
return r;
}

/项目管理超级表格



>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();