急急急!!!在java中,怎样产生一个随机ID,要保证每次产生的ID都不会相同?在线等待

chimu 2003-05-15 03:00:50
在java中,怎样产生一个随机ID?要保证每次产生的ID都不会相同!
...全文
482 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdmonster 2003-05-16
  • 打赏
  • 举报
回复
有随机数不行——看看随机数的生成机制就知道,那种随机是伪随机,不能保证随机性,上面很多朋友也否决了。
用系统时间也有个问题 ,谁把系统时间改了咋办?

这种全局唯一,一般是放在数据库中,保留一个对象相关数的最大值。
既然你不想使用数据库,也可以使用文件,
随机数可以分两部分产生:基数+偏移量
基数是你的程序启动的次数,每启动一次取出基数+1,退出的时候存回去。
偏移量是你本次程序启动期间被请求的次数(应该在int的范围以内吧。)

不知道这种设想能不能解决楼主的问题。
oicu 2003-05-16
  • 打赏
  • 举报
回复
这个要看你的需求特点,
如果系统只有一个application会对DB操作,
那么就用系统时间system.currentTimeMills()就足够保证唯一性了,
当然不要再去加什么随机数了,哈哈,那样太可笑了.
如果整个系统牵涉到复杂的多个子系统,
那么就要改变策略,
比如一个系统做服务负责产生ID,
把它用jndi绑定,
然后其它系统可以查找这个服务取得ID.
toplchx 2003-05-16
  • 打赏
  • 举报
回复
同意 lifejoy(活着的穿马甲中)
重要的是选一个你合适的
lifejoy 2003-05-16
  • 打赏
  • 举报
回复
随机ID是不能保证一定不同的,只能保证在一定的时间内不重复,也就是说可以保证在有限的时间内是一定不回重复的,如果你使用一个128位整数进行随机的话,你在可以预见的将来就是是不回重复的,但是也不能保证一定不会重复的。
gameboy999 2003-05-16
  • 打赏
  • 举报
回复
要求不同步,必须有统一的ID分配策略,你可以使用数据库来取
痞子酷 2003-05-16
  • 打赏
  • 举报
回复
555555555555
我做得是一个snmp网管manager,需要对网络设备采集数据,根据snmp协议,采集数据的请求消息中,必须有每次请求的id,这个id绝对不能重复

和数据库无关的
5555555555555555555555555
这个还不简单,设备标识ID+工号ID+datetime不就唯一啦。
jeston 2003-05-16
  • 打赏
  • 举报
回复
同步你取的数:
如:
long i_cus_no=0;
synchronized(this)
{
Date d=new Date();
i_cus_no=d.getTime();
d=null;
}
binbin2000 2003-05-16
  • 打赏
  • 举报
回复
我也做过snmp的manager,
你可以把每次产生的不重复数写入文件,新产生的数跟文件比较不就行了。
alemjann 2003-05-15
  • 打赏
  • 举报
回复
或者 2002-5-15 17:19:10 这一秒第25个请求
id = 02051517191025
alemjann 2003-05-15
  • 打赏
  • 举报
回复
那就好办了: id = 今天的日期 + 这是今天第几个请求
比如今天是 2002-5-15 今天第100个请求
那就 id = 020515100

***
大概这个思路。不过需要个计数器,每天清零一次!
chimu 2003-05-15
  • 打赏
  • 举报
回复
我做得是一个snmp网管manager,需要对网络设备采集数据,根据snmp协议,采集数据的请求消息中,必须有每次请求的id,这个id绝对不能重复

和数据库无关的
alemjann 2003-05-15
  • 打赏
  • 举报
回复
建立一个序列号最好,不过如果ID是需要用户用的,比如要登陆的时候输入的,那就不太方便了!
痞子酷 2003-05-15
  • 打赏
  • 举报
回复
从数据库中建立一个序列号,select 不就解决啦。
alemjann 2003-05-15
  • 打赏
  • 举报
回复
如果是生成随机的ID,那么重复了也没关系,把数据库的表的ID字段设置成“唯一索引”。那样如果产生的随机ID和表里面的重复了,就插不进数据库,然后根据errorCode就可以判断出来是重复了,然后就重新产生一个,只要把随机算法做的重复率很低就可以了。
moumouren 2003-05-15
  • 打赏
  • 举报
回复
import java.util.*;

public final class IdFactory {

private static final int timeout = 1000*30;
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() );

}

}
SAsura 2003-05-15
  • 打赏
  • 举报
回复
用application范围的变量,然后每次加一,多线程的时候用一个统一的方法去获得这个数值,要线程同步
GFox 2003-05-15
  • 打赏
  • 举报
回复
binbin2000(binbin)
这样不可:)
如果数据量很大的话,Vector不是会变得很大??系统资源都没了
如果数据量小的话倒是可以这样做:)
GFox 2003-05-15
  • 打赏
  • 举报
回复
zez(思恩 为老婆多挣钱 13858318)
如果取当然时间都已经可以不重复,再加上一个随机数怎么又会重复呢??当然不会重复,如果不加上随机数,在同一微秒内得出的数是会重复的!
binbin2000 2003-05-15
  • 打赏
  • 举报
回复
哈哈,这个问题很简单的,我曾经写了个游戏就是这样的。
步骤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中,然后判断新生成的是不是被包含。
GFox 2003-05-15
  • 打赏
  • 举报
回复
同 leshui(大象无形)(有物混成,先天地生) 的方法

当前时间加上1-100的随机数应该能保证是唯一的,因为时间每次都不同嘛

不过这个只能在同一个VM里,不同的VM里时间可能就会相同了..
加载更多回复(5)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧