< prev index next >

src/java.base/share/classes/java/lang/Long.java

Print this page

        

@@ -399,22 +399,10 @@
      * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
      * @param buf the character buffer to write to
      * @param offset the offset in the destination buffer to start at
      * @param len the number of characters to write
      */
-     static void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) {
-        // assert shift > 0 && shift <=5 : "Illegal shift value";
-        // assert offset >= 0 && offset < buf.length : "illegal offset";
-        // assert len > 0 && (offset + len) <= buf.length : "illegal length";
-        int charPos = offset + len;
-        int radix = 1 << shift;
-        int mask = radix - 1;
-        do {
-            buf[--charPos] = Integer.digits[((int) val) & mask];
-            val >>>= shift;
-        } while (charPos > offset);
-    }
 
     /** byte[]/LATIN1 version    */
     static void formatUnsignedLong0(long val, int shift, byte[] buf, int offset, int len) {
         int charPos = offset + len;
         int radix = 1 << shift;

@@ -434,10 +422,43 @@
             StringUTF16.putChar(buf, --charPos, Integer.digits[((int) val) & mask]);
             val >>>= shift;
         } while (charPos > offset);
     }
 
+    static String fastUUID(long lsb, long msb) {
+        if (COMPACT_STRINGS) {
+            byte[] buf = new byte[36];
+            formatUnsignedLong0(lsb,       4, buf, 24, 12);
+            formatUnsignedLong0(lsb >> 48, 4, buf, 19, 4);
+            formatUnsignedLong0(msb,       4, buf, 14, 4);
+            formatUnsignedLong0(msb >> 16, 4, buf, 9,  4);
+            formatUnsignedLong0(msb >> 32, 4, buf, 0,  8);
+
+            buf[23] = '-';
+            buf[18] = '-';
+            buf[13] = '-';
+            buf[8]  = '-';
+
+            return new String(buf, LATIN1);
+        } else {
+            byte[] buf = new byte[72];
+
+            formatUnsignedLong0UTF16(lsb,       4, buf, 24, 12);
+            formatUnsignedLong0UTF16(lsb >> 48, 4, buf, 19, 4);
+            formatUnsignedLong0UTF16(msb,       4, buf, 14, 4);
+            formatUnsignedLong0UTF16(msb >> 16, 4, buf, 9,  4);
+            formatUnsignedLong0UTF16(msb >> 32, 4, buf, 0,  8);
+
+            StringUTF16.putChar(buf, 23, '-');
+            StringUTF16.putChar(buf, 18, '-');
+            StringUTF16.putChar(buf, 13, '-');
+            StringUTF16.putChar(buf,  8, '-');
+
+            return new String(buf, UTF16);
+        }
+    }
+
     /**
      * Returns a {@code String} object representing the specified
      * {@code long}.  The argument is converted to signed decimal
      * representation and returned as a string, exactly as if the
      * argument and the radix 10 were given as arguments to the {@link
< prev index next >