您现在的位置: 爱51代码网 >> 范文 >> 文章正文
java怎么随机生成24字节Byte Array不能有重复

1、java怎么随机生成24字节Byte Array(不能有重复)
2、然后Array通过base64编码获得32字节字符串
public static void main(String[] args) {
    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;
}
import java.util.concurrent.atomic.AtomicLong;
 
import org.apache.catalina.util.Base64;
 
public class Random {
 
    private static final AtomicLong sequence = new AtomicLong();
    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字节的随机数嘛 ,我就凑24字节就好了。
首先,long型数据占8字节,那么,弄3个这样的长整形数据拼凑一下就OK了。
我的方法是将系统时间、伪随机数、自增序列这三个long型数据拼凑在一起。
系统时间,精确到毫秒级,连续获取时有可能存在重复的情况,
所以,将伪随机数拼凑进去,相同种子产生的伪随机数序列,重复的可能性更低一些,
要想去除重复,那么,拼凑一个自增序列进去就可以了,每次获取时该long型数据都会自动增加,变成更大一点的值。

拼凑完成后,将3个long型数据,转换成字节数组,长度正好24字节。
最后,进行Base64编码。

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    redhat 2.6 (santigo 5.6) vsftp
    shell如何实现自动填写操作执行下
    linux shell 文件配置sh:color:
    shell script语法一定要加path吗
    SecureCRT如何访问虚拟机vmWare中
    C#如何读取WINDOWS的放大系数
    cximge的图如何存入数据库并提取
    DBGRID控件显示查询结果文本类型
    TChart控件如何把表中右边的系列
    fastreport提示没有找到fr_class
    cximge的图如何存入数据库并提取
    linux下编译faac及faad2提示 rec
    TClientDataSet如何避免多人更新
    如何用delphi代码修改XML节点
    vc++ pvoid *用delphi怎么表达
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    spring如何动态注解任务调度
    highcharts服务器怎么自动端
    java如何读取web.xml里面的c
    java如何循环可以可以获取到
    Myeclipse 总是去请求一个错
    Java NIO终端关闭后服务器如
    java自动把其中的List<Role>
    web.xml配置问题:"web-app" 
    json格式如何转换成javaBean
    page = (HtmlPage) webClien
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |