生成唯一不重复的随机数
- 在日常开发中需要通过程序生成一系列不重复的随机数,通过Java自带的类库也可以实现,但是在高并发情况下会出现重复的情况,为了尽可能解决不重复的问题,我们通过根据ip地址,MAC地址,访问时间以及哈希算法生成唯一不重复的唯一编号以及访问IP地址获取
- 根据UUID全球唯一标识符也可以实现不重复的编号,具体代码如下
-
1 package com.sun.generat; 2 3 import java.net.InetAddress; 4 import java.util.Random; 5 import java.util.UUID; 6 7 /** 8 * @ClassName: UUIDHexGenerator 9 * @Description:生成不重复的随机数 10 * @author sunt 11 * @date 2017年8月17日 上午11:09:27 12 */ 13 public class UUIDHexGenerator { 14 15 private String sep = ""; 16 private static final int IP; 17 static { 18 int ipadd; 19 try { 20 ipadd = toInt(InetAddress.getLocalHost().getAddress()); 21 } catch (Exception e) { 22 ipadd = 0; 23 } 24 IP = ipadd; 25 } 26 private static short counter = (short) 0; 27 private static final int JVM = (int) (System.currentTimeMillis() >>> 8); 28 29 public static int toInt(byte[] bytes) { 30 int result = 0; 31 for (int i = 0; i < 4; i++) { 32 result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i]; 33 } 34 return result; 35 } 36 37 /** 38 * Unique in a local network 39 */ 40 protected int getIP() { 41 return IP; 42 } 43 44 /** 45 * Unique down to millisecond 46 */ 47 protected short getHiTime() { 48 return (short) (System.currentTimeMillis() >>> 32); 49 } 50 51 protected int getLoTime() { 52 return (int) System.currentTimeMillis(); 53 } 54 55 /** 56 * Unique across JVMs on this machine (unless they load this class in the 57 * same quater second - very unlikely) 58 */ 59 protected int getJVM() { 60 return JVM; 61 } 62 63 protected String format(int intval) { 64 String formatted = Integer.toHexString(intval); 65 StringBuffer buf = new StringBuffer("00000000"); 66 buf.replace(8 - formatted.length(), 8, formatted); 67 return buf.toString(); 68 } 69 70 protected String format(short shortval) { 71 String formatted = Integer.toHexString(shortval); 72 StringBuffer buf = new StringBuffer("0000"); 73 buf.replace(4 - formatted.length(), 4, formatted); 74 return buf.toString(); 75 } 76 77 public String generate() { 78 return new StringBuilder(36).append(format(getIP())).append(sep) 79 .append(format(getJVM())).append(sep) 80 .append(format(getHiTime())).append(sep) 81 .append(format(getLoTime())).append(sep) 82 .append(format(getCount())).toString(); 83 } 84 85 /** 86 * Unique in a millisecond for this JVM instance (unless there are > 87 * Short.MAX_VALUE instances created in a millisecond) 88 */ 89 protected short getCount() { 90 synchronized (UUIDHexGenerator.class) { 91 if (counter < 0) 92 counter = 0; 93 return counter++; 94 } 95 } 96 97 public static void main(String[] args) { 98 UUIDHexGenerator uuidHexGenerator = new UUIDHexGenerator(); 99 String generate = uuidHexGenerator.generate(); 100 System.out.println("---------generate:" + generate); 101 int num = uuidHexGenerator.getIP(); 102 System.out.println("生成的随机数:" + num); 103 System.out.println(UUID.randomUUID().toString()); 104 System.out.println(UUID.randomUUID().toString().replaceAll("\\-", "")); 105 106 } 107 }
最新同步更新地址:https://www.sunnyblog.top/
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的“推荐”将是我最大的写作动力!另外您也可以选择【关注我】,可以很方便找到我!
本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/sunny1009 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!