UUID是通用唯一標識符的縮寫,是一個軟件構建的標準,它使用長度為128位(16位元組)的值來表示信息。UUID可以保證對在同一時空中的所有機器都是唯一的,它實際上上是利用網絡上的時間和計算機MAC地址來生成的。
一、UUID的優點
1、全球唯一性
String uuid = UUID.randomUUID().toString().replaceAll("-", ""); System.out.println(uuid);
UUID採用128位編碼,標識信息的唯一性,長時間不重複,保證了對於海量數據處理時,不會產生衝突。
2、無序性
UUID uuid1 = UUID.randomUUID(); UUID uuid2 = UUID.randomUUID(); System.out.println(uuid1.compareTo(uuid2));
UUID採用無序性的編碼,這個特性可以避免數據庫在寫入數據時,需要枷鎖和解鎖的操作,顯著提升了開發效率。
3、方便存儲和傳輸
UUID uuid = UUID.randomUUID(); ByteBuffer buffer = ByteBuffer.wrap(new byte[16]); buffer.putLong(uuid.getMostSignificantBits()); buffer.putLong(uuid.getLeastSignificantBits()); byte[] array = buffer.array();
UUID僅使用128位,方便對任意平台和數據庫進行數據存儲和傳送。
二、UUID的使用
1、獲取UUID
UUID uuid = UUID.randomUUID(); System.out.println(uuid.toString());
UUID類提供了randomUUID()方法,可以用於獲取一個UUID對象。
2、UUID的表示
UUID uuid = UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d"); System.out.println(uuid.getLeastSignificantBits());
通過fromString()方法可以將字符串轉化成UUID對象,其中的連字符是可選的,但建議保留,這樣可以方便讀取。
3、UUID的比較
UUID uuid1 = UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d"); UUID uuid2 = UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d"); System.out.println(uuid1.equals(uuid2));
UUID類提供了equals()、compareTo()等方法,用於比較兩個UUID的大小是否相等,或者兩個UUID是否相等,如果相等則返回0。
三、UUID生成算法
1、時間戳
private static long toUnixTime(long timeStamp) { return (timeStamp - START_EPOCH) * 10000 + 0x01b21dd213814000L; } private static long timeToMillis(long time) { return (time - 0x01b21dd213814000L) / 10000 + START_EPOCH; } private static final long START_EPOCH; static { Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.set(1582, Calendar.OCTOBER, 15, 0, 0, 0); calendar.set(Calendar.MILLISECOND, 0); START_EPOCH = calendar.getTimeInMillis(); } private static long createTimestamp() { long timestamp = System.currentTimeMillis(); long time = toUnixTime(timestamp); return time; }
UUID生成的過程中,會生成一個時間戳,通過時間戳可以保證生成的UUID在不同時間生成時不會重複。在Java中,可以使用System.currentTimeMillis()方法獲取一個毫秒級別的時間戳。
2、MAC地址
private static long createNode() { InetAddress address; try { address = InetAddress.getLocalHost(); } catch (UnknownHostException e) { throw new RuntimeException(e); } byte[] mac = null; try { mac = NetworkInterface.getByInetAddress(address).getHardwareAddress(); } catch (SocketException e) { throw new RuntimeException(e); } if (mac == null) { return 0xffffffffffffL; } long node = 0; for (int i = 0; i < mac.length; i++) { node |= ((long) mac[i] & 0xff) << (8 * (5 - i)); } return node; }
UUID生成的過程中,還會用到機器的MAC地址,通過MAC地址可以保證生成的UUID在同一時間內,在不同機器上也不會重複。
3、隨機數
private static long createRandom() { SecureRandom random = new SecureRandom(); byte[] bytes = new byte[8]; random.nextBytes(bytes); return ((long) bytes[0] & 0xff) << 56 | ((long) bytes[1] & 0xff) << 48 | ((long) bytes[2] & 0xff) << 40 | ((long) bytes[3] & 0xff) << 32 | ((long) bytes[4] & 0xff) << 24 | ((long) bytes[5] & 0xff) << 16 | ((long) bytes[6] & 0xff) << 8 | ((long) bytes[7] & 0xff); }
UUID生成的過程中,還會用到隨機數,通過隨機數的存在,可以保證生成的UUID的唯一性。
四、UUID的應用場景
1、主鍵
在數據庫中,通常將主鍵設計成UUID,可以避免業務層和數據層之間的耦合,更容易擴展。
2、文件名
在上傳文件時,可以將文件名設置成UUID,可以避免出現重名文件,而且易於管理。
3、網絡通信
在分佈式系統中,可以使用UUID來定義一致的消息格式,方便不同系統之間的通信。
五、總結
UUID是一個通用唯一標識符,具有全球唯一性、無序性、方便傳輸等優點,可以應用於主鍵、文件名、網絡通信等場景。UUID的生成需要時間戳、MAC地址和隨機數的支持,可以採用UUID類提供的方法獲取UUID對象,也可以自己編寫生成算法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/303860.html