解决方案 »
- scjp的考题 求解释
- 很奇怪啊一个简单问题啊,怎么回事···谢谢大家了--急
- linux下批量修改xml文件内容
- 现在用JAVA做验证,不让输入' " = *请大家帮忙看看
- 怎样在java中得到视频文件存的头信息
- 求救:如何编写猜数游戏?
- 为什么用这个session.getAtrribute总报错?
- 请问高手?(关于对javaBean的操作)!!!!!!!!!!!
- JAVA连接ORACLE数据库
- 有谁知道我的JAVA1.3路径设置正确,但退出DOS后再进入DOS时,必须运行AUTOEXEC.BAT才能执行JAVA的程序。不胜感谢!
- 如何让textview的值根据combobox的值而改变?
- 今天写了一个计算器,出现了问题,求大侠帮忙解决,先谢谢了
byte[] bytes = getRandomByteArray(24);
BASE64Encoder encoder = new BASE64Encoder();
System.out.println(encoder.encode(bytes));
}
public static byte[] getRandomByteArray(int len) {
if (len < 0 || len > 256) {
throw new IllegalArgumentException("Illegal length: " + len);
}
byte[] bytes = new byte[256];
for (int i = 0; i < 256; i++) {
bytes[i] = (byte)i;
}
Random rand = new Random();
byte[] randBytes = new byte[len];
int size = 256;
while (--len >= 0) {
int index = rand.nextInt(size);
randBytes[len] = bytes[index];
bytes[index] = bytes[--size];
}
return randBytes;
}
private static void convert(long data, byte[] buffer, int offset){
buffer[offset+0] = (byte)((data>>>56)&0xFF);
buffer[offset+1] = (byte)((data>>>48)&0xFF);
buffer[offset+2] = (byte)((data>>>40)&0xFF);
buffer[offset+3] = (byte)((data>>>32)&0xFF);
buffer[offset+4] = (byte)((data>>>24)&0xFF);
buffer[offset+5] = (byte)((data>>>16)&0xFF);
buffer[offset+6] = (byte)((data>>> 8)&0xFF);
buffer[offset+7] = (byte)((data>>> 0)&0xFF);
}
//该方法在多线程编程中要注意用法(单例),否则会产生重复数据。
public String next(){
long[] rands = new long[3];
rands[1] = System.currentTimeMillis();
java.util.Random jRand = new java.util.Random(rands[1]);
rands[0] = jRand.nextLong();
rands[2] = sequence.incrementAndGet();
byte[] data = new byte[24];
convert(rands[0], data, 0);
convert(rands[1], data, 8);
convert(rands[2], data, 16);
return Base64.encode(data);
}
public static void main(String[] args) {
Random rand = new Random();
System.out.println(rand.next());
System.out.println(rand.next());
}}
难道我理解错了?你的意思是像我代码保证的数组24个字节各不相同,
还是你生成的1000W个数组之间各不相同?
难道我理解错了?你的意思是像我代码保证的数组24个字节各不相同,
还是你生成的1000W个数组之间各不相同?
1000w个数组各不相同
首先,long型数据占8字节,那么,弄3个这样的长整形数据拼凑一下就OK了。
我的方法是将系统时间、伪随机数、自增序列这三个long型数据拼凑在一起。
系统时间,精确到毫秒级,连续获取时有可能存在重复的情况,
所以,将伪随机数拼凑进去,相同种子产生的伪随机数序列,重复的可能性更低一些,
要想去除重复,那么,拼凑一个自增序列进去就可以了,每次获取时该long型数据都会自动增加,变成更大一点的值。拼凑完成后,将3个long型数据,转换成字节数组,长度正好24字节。
最后,进行Base64编码。
楼主的要求,我已经编码实现了,并且,在后续的过程中做了详细的解释。
但是,3楼的代码没有达到楼主的要求,却给了10分。后续的一个问题(并不是楼主所要的算法)却给了20分。
那我以后岂不是随便搞错点什么东西,就能拿得比那些认真解决问题的人拿得多了?
如果有人比我的算法好,还能实现楼主的要求,那我无话可说。
但是,3楼的算法,虽然保证了24个字节的每个字节各不相同,但是,无法保证这个序列的不可重复性。
楼主的要求,是要取得像UUID那样的不能重复的数据。