可以帮当前的时间取出来
再加上一个随机数
就有不重复的id了out.println((int)(Math.random()*100)+1);
产生1-100的随机数
再加上一个随机数
就有不重复的id了out.println((int)(Math.random()*100)+1);
产生1-100的随机数
解决方案 »
- 配置jdk7环境时为什么总无法加载主类 com.sun.tools.javac.Main?大家帮忙看看
- JDBC 在createStatement时设置游标是TYPE_FORWARD_ONLY,但是结果集中还是可以用previous()方法
- Java打印的问题
- 急求!!!有没有比较好的工具写java代码,能不能不要全部是手工的?
- EJB,struts问题
- 关于内存中类对象与类对象引用的分配
- oracle 换成sqlserver的尴尬。。。。。
- 类中的 this 的使用 困惑 求解 ...
- 求助各位大虾:关于session
- 怎么回事???
- 请教一个关于Java的IO中的getLineNumber()方法的问题!
- 中文问题!
new Date().getTime().一个长整形,如果嫌太大,就减去一个常量即可.
加上一个随机数不可以.有可能重复了就!
步骤1,产生Vector ctor = new Vector();
步骤2,产生数 int tt = Random();
步骤三,把数放到Vector中。Integer ttt = new Integer(tt);ctor.Add(ttt);
继续产生:
while(ctor.Contains(ttt))
{
tt = Math.Random();
ttt = new Integer(tt);
}
return tt;
也就是每次生成都放到vector中,然后判断新生成的是不是被包含。
如果取当然时间都已经可以不重复,再加上一个随机数怎么又会重复呢??当然不会重复,如果不加上随机数,在同一微秒内得出的数是会重复的!
这样不可:)
如果数据量很大的话,Vector不是会变得很大??系统资源都没了
如果数据量小的话倒是可以这样做:)
private static int increment = 0;
private Date date = new Date();
private static IdFactory instance; private IdFactory(){} public static IdFactory getInstance(){
if(instance==null){
instance = new IdFactory();
}else{
if(((new Date()).getTime() - instance.date .getTime())>timeout || instance.increment >=9){
instance.date = new Date();
}
}
return instance;
} public synchronized String generate(){
long code = date.getTime() ;
return ""+code+(increment++);
} public static void main(String[] a){
System.out.println(IdFactory.getInstance() .generate() );
System.out.println(IdFactory.getInstance() .generate() );
System.out.println(IdFactory.getInstance() .generate() );
System.out.println(IdFactory.getInstance() .generate() );
System.out.println(IdFactory.getInstance() .generate() ); }}
比如今天是 2002-5-15 今天第100个请求
那就 id = 020515100***
大概这个思路。不过需要个计数器,每天清零一次!
你可以把每次产生的不重复数写入文件,新产生的数跟文件比较不就行了。
如:
long i_cus_no=0;
synchronized(this)
{
Date d=new Date();
i_cus_no=d.getTime();
d=null;
}
我做得是一个snmp网管manager,需要对网络设备采集数据,根据snmp协议,采集数据的请求消息中,必须有每次请求的id,这个id绝对不能重复和数据库无关的
5555555555555555555555555
这个还不简单,设备标识ID+工号ID+datetime不就唯一啦。
重要的是选一个你合适的
如果系统只有一个application会对DB操作,
那么就用系统时间system.currentTimeMills()就足够保证唯一性了,
当然不要再去加什么随机数了,哈哈,那样太可笑了.
如果整个系统牵涉到复杂的多个子系统,
那么就要改变策略,
比如一个系统做服务负责产生ID,
把它用jndi绑定,
然后其它系统可以查找这个服务取得ID.
用系统时间也有个问题 ,谁把系统时间改了咋办?这种全局唯一,一般是放在数据库中,保留一个对象相关数的最大值。
既然你不想使用数据库,也可以使用文件,
随机数可以分两部分产生:基数+偏移量
基数是你的程序启动的次数,每启动一次取出基数+1,退出的时候存回去。
偏移量是你本次程序启动期间被请求的次数(应该在int的范围以内吧。)不知道这种设想能不能解决楼主的问题。