12位随机数,可以有字母。一年内不重复如何解决

一次生成四个随机号码,12位,可以字母和数字的组合,不能有规律,一年内不能重复。要考虑并发。有没有不去对比以前的,生成后就保证不重复。如果用oracle生成序列的话要如何转才能不看出规律?

[code="java"]
System.out.println(Long.toString(new Date().getTime(), 36));
[/code]

这里只有数字和字母,只有8位。
要筹12位可以再加入一些随机数。

时间戳+访问者IP地址 加密

实现了一个算法,思想就是一对多映射;
以下为从100000000000开始的序列映射的结果:
dA99iA6ANirN
dNiiArNNAi9h
e9NN6NAr9N6X
h9A9966AANrt
O6NA6rAri9AP
MAN99A9NN6NE
eNiA6ArA6r6g
d6N99N96rNrk
Oi696AriA6NI
eArAN9irA6r2
SAiiNA6r6rSr
SiN9iNiAN6hM
ei966rAr9idC

UUID不行吗? :oops:

时间戳级够了,另外4位随便取,在并发情况下时间戳可能一样吗?

如果考虑并发就把生成编号的类设计成单例模式,然后加锁便可

同意楼上 UUID 然后截取12位

8位日期+4位随即数

必须要 12 位吗? 如果不是 12 位,可以这样 md5( uuid )

用uuid 你想要多少位就有多少位。
[code="java"]public static String createUUID(int len) {

    String uuid = java.util.UUID.randomUUID().toString()
            .replaceAll("-", "");
    return uuid.substring(0, len);
}[/code]

为什么不可以是13位呢?取当前系统的毫秒多省事儿?
System.currentTimeMillis()
十年都不带重复的

3位天数+2位小时+2位分钟+2位秒+3位毫秒
例如:172133259241
172表示三位天数,今天是今年的第172天,天数不满三位的前补0
13点32分59秒241毫秒 时分秒不满两位的前补0

机器号+线程号 +时间

System.currentTimeMillis() 即可

http://blog.sina.com.cn/s/blog_927f3c2401011epo.html

首页取出当前系统时间,然后把它存放到一个stringbuffer str里

Date date = new Date();//获取当前系统时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSSS");//设置格式化格式
return sdf.format(date);//返回格式化后的时间
然后:
StringBuffer sb = new StringBuffer();//定义字符串对象
sb.append(getStringTime());//向字符串对象中添加当前系统时间
for (int i = 0; i <n ;i++) {//随机生成n位数
sb.append(random.nextInt(9));//将随机生成的数字添加到字符串对象中
}
return sb.toString();//返回字符串

可以使用java的UUID唯一标识类,他会生成全球唯一编码,

哈哈,1年内不许重复,1年后就可以重复了?你理解问题都不准确。

使用uuid 多简单,几千年都不会重复,更何况一年乎?