精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-25
ialand 写道 不错,我以前也做过一个类似的东西,不过不是生成数字,而是一个固定长度的随机字符串,这个字符串随机取自a-z,0-9的字符,按照你这个需求,只需要从0-9里面随机取指定长度个数的元素组成一个固定的字符串,再把这个字符串转成数字即可,不知道有没有理解到你的需求。和你的不同是我没有用其它的第三方包,完全自己实现(因为不知道有这个东西),不过这种东西还是挺有意思的,呵呵
你理解得太到位了~~~ 其实commons-lang的RandomStringUtils.randomNumeric(int count)就相当于你实现的那个东西 |
|
返回顶楼 | |
发表时间:2010-01-26
lazyman333 写道 Arden 写道 有这个东西的话不可以做数据库主键生成器了?
是的,我也是基于这个原因而做这个工具的 怎么保证不重复? |
|
返回顶楼 | |
发表时间:2010-01-26
扯 还DB 主键呢
randomNumeric的源码通读过了吗 做过严谨的测试吗 一眼看上去 这个函数的重复性不会比Random.nextInt小多少 |
|
返回顶楼 | |
发表时间:2010-01-26
apache的工具包真是好多啊,这个没用过,谢谢分享~
|
|
返回顶楼 | |
发表时间:2010-01-26
推荐使用JAVA 自带的UUID,
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长. GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复 import java.util.UUID; ... String id = UUID.randomUUID().toString(); |
|
返回顶楼 | |
发表时间:2010-01-26
lazyman333 写道 stupidmxx 写道 话说,
Random rand = new Random(); return rand.nextInt((long)Math.pow(10, digit)); 这样不就行了么。。。 rand.nextInt(max)得到的结果是0到max-1的数, 而RandomNumberUtil.randLong(digit)产生的是指定位数的数,如果你传的参数是5,则返回结果是:10000到99999,同学仔细看看哦 IllegalArgumentException确实是RuntimeException的子类,谢谢同学提醒~~~ ,我已经改过来了 好吧。。。原来是这样的需求。what about this? long base = (long)Math.pow(10, digit); return rand.nextInt(base*9) + base; // 产生0到89999之间的符合平均分布的随机数,再加上10000,成为10000到999999之间的符合平均分布的随机数。 |
|
返回顶楼 | |
发表时间:2010-01-26
jd2bs 写道 扯 还DB 主键呢
randomNumeric的源码通读过了吗 做过严谨的测试吗 一眼看上去 这个函数的重复性不会比Random.nextInt小多少 的确做主键是不可取的,毕竟这只是个随机数生成器而不是有contract约定的随机序列生成器。但是lz哪里有说要做db主键了吗? |
|
返回顶楼 | |
发表时间:2010-01-26
jd2bs 写道 扯 还DB 主键呢
randomNumeric的源码通读过了吗 做过严谨的测试吗 一眼看上去 这个函数的重复性不会比Random.nextInt小多少 while(count-- != 0) { char ch; if(chars == null) ch = (char)(random.nextInt(gap) + start); else ch = chars[random.nextInt(gap) + start]; if(letters && numbers && Character.isLetterOrDigit(ch) || letters && Character.isLetter(ch) || numbers && Character.isDigit(ch) || !letters && !numbers) buffer.append(ch); else count++; } 这是randomNumeric 的实现代码, 它也是对random.nextInt 的封装 所以两者是相同的 ,或者 randomNumeric 更优 。 我没空继续读random.nextInt的实现。 而randomNumeric 是更符合应用的 |
|
返回顶楼 | |
发表时间:2010-01-26
gqf2008 写道 lazyman333 写道 Arden 写道 有这个东西的话不可以做数据库主键生成器了?
是的,我也是基于这个原因而做这个工具的 怎么保证不重复? 会有重复的,这只是产生随机数而已,不产生惟一主键 |
|
返回顶楼 | |
发表时间:2010-01-26
jd2bs 写道 扯 还DB 主键呢
randomNumeric的源码通读过了吗 做过严谨的测试吗 一眼看上去 这个函数的重复性不会比Random.nextInt小多少 离生成主键还远着呢,此处的用途不是为了产生db主键,生成的随机数是拿去访问db的,重复是允许的 |
|
返回顶楼 | |