我正在尝试生成一个唯一的随机字符串。
var string = Math.floor( Math.random() * 1000 ) + Date.now();
我现在使用的上述方法给了我太长的字符串,我想要一个更短的独特字符。
答案 0 :(得分:2)
以下是避免重复ID问题的解决方法:
var GenRandom = {
Stored: [],
Job: function(){
var newId = Date.now().toString().substr(6); // or use any method that you want to achieve this string
if( this.Check(newId) ){
this.Job();
}
this.Stored.push(newId);
return newId; // or store it in sql database or whatever you want
},
Check: function(id){
for( var i = 0; i < this.Stored.length; i++ ){
if( this.Stored[i] == id ) return true;
}
return false;
}
};
<强> jsFiddle 强>
答案 1 :(得分:0)
根据Tushar的建议,(new Date().getTime()+'').substr(6,7)
将为您提供7位数的唯一编号。不是随机的,而是独特的...至少在一定时间内。由于它基于时间戳,因此实际上是毫秒时间。由于长度为7位,因此每1000秒将从0000000循环至9999999,大约为17分钟。但是你不能期望更高的独特性水平&#34;只有7位数。它可能足以满足您的应用需求,具体取决于您希望实现的目标。
修改强>
跟进你的评论:你想要一个唯一的SECOND号码,所以毫秒对你没用(应该提到你问题中的秒数)。
您可以为发票指定当前秒数,即(new Date().getTime()+'').substr(3,7)
。如果唯一编号不限于7位数,那将是完美的。这使得9.999.999可能的秒数,即......大约115天。
使用9位数字,您可以在316年内每秒打印唯一的发票号码。
因此,在我看来,您唯一的解决方案就是从0000001开始计算发票,然后是0000002等,并在某处保持跟踪,以确保唯一性。我不知道如何在0到9.999.999之间生成随机号码,这样可以使发票编号更有效或更容易跟踪。
答案 2 :(得分:0)
对于发票号,无论多长时间,您都应该保证唯一标识符。在这种情况下,我建议使用UUID / GUID。有关两种实现(windows-COM / non-windows),请参阅http://guid.us/GUID/PHP。如果您不熟悉UUID的概念,请在此处查看维基百科:http://en.wikipedia.org/wiki/Universally_unique_identifier。
另一个选择是使用mysql的本机uuid生成器:
select uuid();
您也可以在插入查询中使用,例如:
insert into mytable (id, data) values (uuid(), 'mytext');
当然,您的表格结构需要调整。我个人认为最好使用传统的整数auto_inc id作为主键,以及在复制/导出/等中使用的guid字段作为键。
修改强> 显然在mysql中也有一个uuid_short()函数(自5.1.20起)。
SELECT UUID_SHORT();
92395783831158784
请参阅https://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html#function_uuid-short