Generates random UUIDs
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ import java.security.SecureRandom; /** * * RandomUuidFactory is a {@linkplain UuidFactory UuidFactory} that generates * random UUIDs. This implementation uses the JDK's java.security.SecureRandom * to generate sufficiently random values for the UUIDs. * <br><br> * This class is a singleton, so it must be constructed through the static * getInstance() method. * * @author Dan Jemiolo (danj) * */ public class RandomUuidFactory { private static final RandomUuidFactory _SINGLETON = new RandomUuidFactory(); private static final char[] _HEX_VALUES = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; // // Used to create all random numbers - guarantees unique strings // during the process lifetime // private static final SecureRandom _RNG = new SecureRandom(); /** * * The default constructor is explicit so we can make it private and * require use of getInstance() for instantiation. * * @see #getInstance() * */ private RandomUuidFactory() { // // this is just to prevent instantiation // } /** * * @return A unique UUID of the form <em>uuid:<b>X</b></em>, where * <b>X</b> is the generated value. * */ public String createUUID() { // // first get 16 random bytes... // byte[] bytes = new byte[16]; _RNG.nextBytes(bytes); StringBuffer uuid = new StringBuffer(41); uuid.append("uuid:"); // // ...then we need to shift so they're valid hex (0-9, a-f) // for (int n = 0; n < 16; ++n) { // // (there's really no elegant way to add the dashes...) // if (n == 4 || n == 6 || n == 8 || n == 10) uuid.append('-'); // // shift the bits so they are proper hex // int hex = bytes[n] & 255; uuid.append(_HEX_VALUES[hex >> 4]); uuid.append(_HEX_VALUES[hex & 15]); } return uuid.toString(); } /** * * @return The singleton instance of this class. * */ public static RandomUuidFactory getInstance() { return _SINGLETON; } }