/*
* 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;
}
}