JDK之UUID

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/thebigdipperbdx/article/details/82769089

运用

public static void main(String[] args) {
    System.out.println("格式前的UUID : " + UUID.randomUUID().toString());
    System.out.println("格式化后的UUID :" + UUID.randomUUID().toString().replace("-", ""));
}

源码

构造函数

 private UUID(byte[] data) {
     long msb = 0;
     long lsb = 0;
     assert data.length == 16 : "data must be 16 bytes in length";
     for (int i=0; i<8; i++)
         msb = (msb << 8) | (data[i] & 0xff);
     for (int i=8; i<16; i++)
         lsb = (lsb << 8) | (data[i] & 0xff);
     this.mostSigBits = msb;
     this.leastSigBits = lsb;
 }

 public UUID(long mostSigBits, long leastSigBits) {
     this.mostSigBits = mostSigBits;
     this.leastSigBits = leastSigBits;
 }

成员属性

  /*
   * The most significant 64 bits of this UUID.
   */
  private final long mostSigBits;

  /*
   * The least significant 64 bits of this UUID.
   */
  private final long leastSigBits;

内部类Holder

 /*
  * The random number generator used by this class to create random
  * based UUIDs. In a holder class to defer initialization until needed.
  */
 private static class Holder {
     static final SecureRandom numberGenerator = new SecureRandom();
 }

成员方法

 /**
   * Static factory to retrieve a type 4 (pseudo randomly generated) UUID.
   *
   * The {@code UUID} is generated using a cryptographically strong pseudo
   * random number generator.
   *
   * @return  A randomly generated {@code UUID}
   */
  public static UUID randomUUID() {
      SecureRandom ng = Holder.numberGenerator;

      byte[] randomBytes = new byte[16];
      ng.nextBytes(randomBytes);
      randomBytes[6]  &= 0x0f;  /* clear version        */
      randomBytes[6]  |= 0x40;  /* set to version 4     */
      randomBytes[8]  &= 0x3f;  /* clear variant        */
      randomBytes[8]  |= 0x80;  /* set to IETF variant  */
      return new UUID(randomBytes);
  }
  
  public String toString() {
      return (digits(mostSigBits >> 32, 8) + "-" +
              digits(mostSigBits >> 16, 4) + "-" +
              digits(mostSigBits, 4) + "-" +
              digits(leastSigBits >> 48, 4) + "-" +
              digits(leastSigBits, 12));
  }
    
  public static UUID nameUUIDFromBytes(byte[] name) {
      MessageDigest md;
      try {
          md = MessageDigest.getInstance("MD5");
      } catch (NoSuchAlgorithmException nsae) {
          throw new InternalError("MD5 not supported", nsae);
      }
      byte[] md5Bytes = md.digest(name);
      md5Bytes[6]  &= 0x0f;  /* clear version        */
      md5Bytes[6]  |= 0x30;  /* set to version 3     */
      md5Bytes[8]  &= 0x3f;  /* clear variant        */
      md5Bytes[8]  |= 0x80;  /* set to IETF variant  */
      return new UUID(md5Bytes);
  }

  public static UUID fromString(String name) {
      String[] components = name.split("-");
      if (components.length != 5)
          throw new IllegalArgumentException("Invalid UUID string: "+name);
      for (int i=0; i<5; i++)
          components[i] = "0x"+components[i];

      long mostSigBits = Long.decode(components[0]).longValue();
      mostSigBits <<= 16;
      mostSigBits |= Long.decode(components[1]).longValue();
      mostSigBits <<= 16;
      mostSigBits |= Long.decode(components[2]).longValue();

      long leastSigBits = Long.decode(components[3]).longValue();
      leastSigBits <<= 48;
      leastSigBits |= Long.decode(components[4]).longValue();

      return new UUID(mostSigBits, leastSigBits);
  }

猜你喜欢

转载自blog.csdn.net/thebigdipperbdx/article/details/82769089
今日推荐