如题,我自己写了一个,是根据系统时间来产生的,但是后来觉得这样也不是唯一的,
(date.getMonth() + 1) * 0x5f5e100 +
date.getDate()* 0xf4240 +
date.getHours() * 10000 +
date.getMinutes() * 100 +
date.getSeconds();位数还不够,而且同一秒产生的流水号是相同的 ,我要产生流水号是唯一的。求各位给个函数
谢谢了
(date.getMonth() + 1) * 0x5f5e100 +
date.getDate()* 0xf4240 +
date.getHours() * 10000 +
date.getMinutes() * 100 +
date.getSeconds();位数还不够,而且同一秒产生的流水号是相同的 ,我要产生流水号是唯一的。求各位给个函数
谢谢了
final short MAX_PER_SECOND = 10000;private synchronized short getNextSeq() {
seq ++;
seq %= MAX_PER_SECOND;
}这样只要你在一秒内没有生成超过10000个号码,就不会重复。
可以修改那个常量以提供更大的适应性。
不过,因为synchronized操作需要耗时间,所以实际上会降低每秒的处理数。这个方法在这儿仅供参考。
return seq惭愧啊!
(date.getMonth() + 1) * 0x5f5e100 +
date.getDate()* 0xf4240 +
date.getHours() * 10000 +
date.getMinutes() * 100 +
date.getSeconds();位数还不够,而且同一秒产生的流水号是相同的 ,我要产生流水号是唯一的。位数不够:可以用两个整型数来表示流水号,而不要用一个.
保证流水号唯一:要记录已经产生的流水号,当产生新的时候,要去查找一下,新产生的流水号是否已经存在,如存在,再产生一个,直到找到一个合法的.产生两个七位的数连成十四位的流水号:产生两个在1000000与10000000之间的随机数就行了.
然后把那随机的6位按统一方式插入前8位。
估计就没人编得出来了。
想防伪就留几位作效验。
* getPK,获得数据库使用的一个long型唯一主键
* 16位,同一微秒内3000个不会重复
* @return long
*/
private static long[] ls = new long[3000];
private static int li = 0;
public synchronized static long getPK()
{
long lo = getpk();
for (int i = 0; i < 3000; i++)
{
long lt = ls[i];
if (lt == lo)
{
lo = getPK();
break;
}
}
ls[li] = lo;
li++;
if (li == 3000)
{
li = 0;
}
return lo;
} private static long getpk()
{
String a = (String.valueOf(System.currentTimeMillis())).substring(3, 13);
String d = (String.valueOf(Math.random())).substring(2, 8);
return Long.parseLong(a + d);
}