随机数组合,随机号码产生器

public class RandomUtil {

    private static Random random = new Random();


    public static String getRandomNumber(String[] range,int rangeLength,int length){
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<length;i++){
            sb.append(String.valueOf(range[random.nextInt(rangeLength)]));
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String[] range = {"0","1","2","3","4","5","6","7","8","9"};
        System.out.println(getRandomNumber(range, 10, 8));

    }
}

 运行结果:

91373770

 以上是最简单的随机数产生,不排除产生相同随机数的可能性。如果投入使用,需要加上一个过滤器,将重复数据进行过滤,真实应用中,你会发现8位数据产生到50多W的时候就会经常性发生重复数据。

 

 

 

二. 那么如何产生唯一的随机数呢,参考如下代码:

 

public class GUIDUtil 
{
    /* 随机种子 */
	private static char x36s[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
	/* 随机数长度 */
	private static short len = 20;
	
	public static String newId() 
	{
		char chs[] = new char[len];
		
		/**
		 * 生成前8位随机字符(以系统时间为随机池, 以36位数字+英文字母为随机种子)
		 */
		System.out.println(System.currentTimeMillis()-936748800000L);
		long v = (System.currentTimeMillis()-936748800000L)>>1;	//1999-9-9 开始,起码要横跨102年:)
		for(int i=7; i>0; i--)
		{
			chs[i] = x36s[(int)(v%36)];
			v = v/36;
		}
		chs[0] = x36s[(int)(v%26) + 10]; //确保第一个随机字符是"字母", 以符合一般编程的标识符定义

		/**
		 * 生成后12位随机字符(以UUID为随机池, 以36位数字+英文字母为随机种子)
		 */
		UUID u = UUID.randomUUID();
		v = u.getLeastSignificantBits()^u.getMostSignificantBits();
		System.out.println(v);
		if(v < 0)
		{
			v = -v;
		}

		for(int i=8; i<len; i++)
		{
			chs[i] = x36s[(int)(v%36)];
			v = v/36;
		}
		
		return new String(chs);
	}
}

 如上部分采用了比较通用的UUID标准产生算法。在产生时尽量通过jvm的与或和移位操作,保证了JVM的高效执行,这些操作在新的JVM里面是可以直接运算的,不需要其它步骤。甚至hashCode计算时使用的*31在新的JVM里面也可以转换成移位操作的。(这是题外话)

通过时间戳+UUID最高位和最低位异或的方式获得,能保证近似唯一ID的获得。

三.如上的方法真的能保证唯一ID吗?

 

答案是否定的,影响ID产生的无非是MAC地址+时间戳+随机数 。在分布式应用中,同一台机器也可能在同一时间被不同的应用访问,数据量很大时,很有可能产生相同的ID,并且使用JAVA的guid效率并不高。这里可以通过用一台server机器来预先生成唯一ID,这个是批量生成的。然后供应用去取。

如下:

 



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值