JAVA自定义INT增量类型的UUID函数,请大家给点意见

findshine 2015-12-20 01:00:53
public static String UUID()
{
java.util.Random r=new java.util.Random();
//如生成的随机位数不足6位则自动加零补充
DecimalFormat g=new DecimalFormat("1000000");
//返回时间增量+随机数的序列
return String.format("%s%s",System.currentTimeMillis(),g.format(r.nextInt(1000000)));
}

方法详见如上。

因为java.util.UUID.randomUUID产生的UUID确实很不错,但是主要原因是STRING类型,数据库增量主键在数据迁移时又会重,所以就做了一个上面的函数,生成的最后是数字类型(可以返回后转换一下),并且是时间增量,如果不刻意修改时间,可以说永不会重。

我测试了1000条 没问题。

还请大家给点意见。
...全文
1021 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_20062767 2015-12-23
  • 打赏
  • 举报
回复
分析一下,首先你的生成策略是System.currentTimeMillis(),g.format(r.nextInt(1000000)),先看System.currentTimeMillis(),这个是系统时间的毫秒值,如果是多线程的环境下是有可能重复的,因为有多人同一个时间对数据操作时很正常的,可能你是想通过后面的r.nextInt(1000000)来确保系统时间一样的前提下后面生成的随机整数不一样,但是这样是有可能一样的,这个随机数范围是[0, 999999],每次生成的整数是这个范围中的其中一个,但是有可能是一样的,概率很低而已。其实为了确保百分百唯一性,你可以使用一个自增的变量,可以从100000开始,然后每次自加1就行了,但是要加锁,要不也会重复。
开拓者Amadues 2015-12-20
  • 打赏
  • 举报
回复
自增型的主键就没怎么见过。数据库存取数据本来就是以String型的为佳,如果要运算的话,那可以取到程序里做个转换。 uuid是32位的,我不知道你这个返回的是几位的,而且只有1000条就下结论说不会重复未免太早。 UUID也是通过时间等因素算出来的,但不止时间一个因素,比如分布式系统里,同一时间产生的号也要保证是不同的。 而且那个算法是经过专业验证的,比如一秒产生多少个随机数,一直到多少年以后才会出现重复。

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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