uuidgenerator.java

来自「OpenJMS是一个开源的Java Message Service API 1.」· Java 代码 · 共 899 行 · 第 1/3 页

JAVA
899
字号
/** * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright *    statements and notices.  Redistributions must also contain a *    copy of this document. * * 2. Redistributions in binary form must reproduce the *    above copyright notice, this list of conditions and the *    following disclaimer in the documentation and/or other *    materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote *    products derived from this Software without prior written *    permission of Intalio.  For written permission, *    please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" *    nor may "Exolab" appear in their names without prior written *    permission of Intalio. Exolab is a registered *    trademark of Intalio. * * 5. Due credit should be given to the Exolab Project *    (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY INTALIO AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL * INTALIO OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 1999-2004 (C) Intalio Inc. All Rights Reserved. * * $Id: UUIDGenerator.java,v 1.1 2004/11/26 01:50:35 tanderson Exp $ */package org.exolab.jms.common.uuid;import java.security.SecureRandom;import java.util.HashSet;import java.util.Random;/** * Universally Unique Identifier (UUID) generator. * <p> * A UUID is an identifier that is unique across both space and time, * with respect to the space of all UUIDs. A UUID can be used for * objects with an extremely short lifetime, and to reliably identifying * very persistent objects across a network. UUIDs are 128 bit values * and encoded as 36 character identifiers. * <p> * This generator produces time-based UUIDs based on the varient * specified in a February 4, 1998 IETF draft. * <p> * Unprefixed identifiers are generated by calling {@link #create() * create}. A method is also provided to create prefixed identifiers. * Prefixed identifiers are useful for logging and associating * identifiers to application objects. * <p> * To assure that identifiers can be presisted, identifiers must be * kept within the limit of {@link #MAXIMUM_LENGTH} characters. * This includes both prefixed identifiers and identifiers created * by the application. The {@link #trim trim} method can be used to * trim an identifier to the maximum allowed length. If an* identifier * was generated with no prefix, or with the maximum supported prefix * legnth, the identifier is guaranteed to be short enough and this * method is not required. * <p> * Convenience methods are also provided for converting an identifier * to and from an array of bytes. The conversion methods assume that * the identifier is a prefixed or unprefixed encoding of the byte * array as pairs of hexadecimal digits. * <p> * The UUID specification prescribes the following format for * representing UUIDs. Four octets encode the low field of the time * stamp, two octects encode the middle field of the timestamp, * and two octets encode the high field of the timestamp with the * version number. Two octets encode the clock sequence number and * six octets encode the unique node identifier. * <p> * The timestamp is a 60 bit value holding UTC time as a count of 100 * nanosecond intervals since October 15, 1582. UUIDs generated in * this manner are guaranteed not to roll over until 3400 AD. * <p> * The clock sequence is used to help avoid duplicates that could arise * when the clock is set backward in time or if the node ID changes. * Although the system clock is guaranteed to be monotonic, the system * clock is not guaranteed to be monotonic across system failures. * The UUID cannot be sure that no UUIDs were generated with timestamps * larger than the current timestamp. * <p> * If the clock sequence can be determined at initialization, it is * incremented by one, otherwise it is set to a random number. * The clock sequence MUST be originally (i.e. once in the lifetime * of a system) initialized to a random number to minimize the * correlation across systems. The initial value must not be correlated * to the node identifier. * <p> * The node identifier must be unique for each UUID generator. * This is accomplished using the IEEE 802 network card address. * For systems with multiple IEEE 802 addresses, any available address * can be used. For systems with no IEEE address, a 47 bit random value * is used and the multicast bit is set so it will never conflict with * addresses obtained from network cards. * <p> * The UUID state consists of the node identifier and clock sequence. * The state need only be read once when the generator is initialized, * and the clock sequence must be incremented and stored back. If the * UUID state cannot be read and updated, a random number is used. * <p> * The UUID generator is thread-safe. * <p> * This class originally came from Tyrex: http://tyrex.sourceforge.net * * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a> * @version $Revision: 1.1 $ $Date: 2004/11/26 01:50:35 $ */public final class UUIDGenerator {    /**     /**     * The identifier resolution in bytes. Identifiers are 16-byte     * long, or 128 bits. Without a prefix, an identifier can be     * represented as 36 hexadecimal digits and hyphens.     * (4 hyphens are used in the UUID format)     */    public static final int RESOLUTION_BYTES = 16;    /**     * The maximum length of an identifier in textual form.     * Prefixed identifiers and application identifiers must be     * less or equal to the maximum length to allow persistence.     * This maximum length is 64 characters.     */    public static final int MAXIMUM_LENGTH = 64;    /**     * The maximum length of an identifier prefix. Identifiers     * created using {@link #create(String) create(String)} with     * a prefix that is no longer than the maximum prefix size     * are guaranteed to be within the maximum length allowed     * and need not be trimmed.     */    public static final int MAXIMUM_PREFIX = 28;    /**     * The variant value determines the layout of the UUID. This     * variant is specified in the IETF February 4, 1998 draft.     * Used for character octets.     */    private static final int UUID_VARIANT_OCTET = 0x08;    /**     * The variant value determines the layout of the UUID. This     * variant is specified in the IETF February 4, 1998 draft.     * Used for byte array.     */    private static final int UUID_VARIANT_BYTE = 0x80;    /**     * The version identifier for a time-based UUID. This version     * is specified in the IETF February 4, 1998 draft. Used for     * character octets.     */    private static final int UUID_VERSION_CLOCK_OCTET = 0x01;    /**     * The version identifier for a time-based UUID. This version     * is specified in the IETF February 4, 1998 draft. Used for     * byte array.     */    private static final int UUID_VERSION_CLOCK_BYTE = 0x10;    /**     * The version identifier for a name-based UUID. This version     * is specified in the IETF February 4, 1998 draft. Used for     * character octets.     */    private static final int UUID_VERSION_NAME_OCTET = 0x03;    /**     * The version identifier for a name-based UUID. This version     * is specified in the IETF February 4, 1998 draft. Used for     * byte array.     */    private static final int UUID_VERSION_NAME_BYTE = 0x30;    /**     * The version identifier for a random-based UUID. This version     * is specified in the IETF February 4, 1998 draft. Used for     * character octets.     */    private static final int UUID_VERSION_RANDOM_CLOCK = 0x04;    /**     * The version identifier for a random-based UUID. This version     * is specified in the IETF February 4, 1998 draft. Used for     * byte array.     */    private static final int UUID_VERSION_RANDOM_BYTE = 0x40;    /**     * The difference between Java clock and UUID clock. Java clock     * is base time is January 1, 1970. UUID clock base time is     * October 15, 1582.     */    private static final long JAVA_UUID_CLOCK_DIFF = 0x0b1d069b5400L;    /**     * Efficient mapping from 4 bit value to lower case hexadecimal digit.     */    private final static char[] HEX_DIGITS = new char[]{        '0', '1', '2', '3', '4', '5', '6', '7',        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};    /**     * The number of UUIDs that can be generated per clock tick.     * UUID assumes a clock tick every 100 nanoseconds. The actual     * clock ticks are measured in milliseconds and based on the     * sync-every property of the clock. The product of these two     * values is used to set this variable.     */    private static int _uuidsPerTick;    /**     * The number of UUIDs generated in this clock tick. This counter     * is reset each time the clock is advanced a tick. When it reaches     * the maximum number of UUIDs allowed per tick, we block until the     * clock advances.     */    private static int _uuidsThisTick;    /**     * The last clock. Whenever the clock changes, we record the last clock     * to identify when we get a new clock, or when we should increments     * the UUIDs per tick counter.     */    private static long _lastClock;    /**     * The clock sequence. This is randomly initialised, and is made of     * four hexadecimal digits.     */    private static char[] _clockSeqOctet;    /**     * The clock sequence. The clock sequence is obtained from the UUID     * properties and incremented by one each time we boot, or is     * generated randomaly if missing in the UUID properties. The clock     * sequence is made of two bytes.     */    private static byte[] _clockSeqByte;    /**     * The node identifier. The node identifier is obtained from the     * UUID properties, or is generated if missing in the UUID properties.     * The node identifier is made of twelve hexadecimal digits.     */    private static char[] _nodeIdentifierOctet;    /**     * The node identifier. The node identifier is obtained from the     * UUID properties, or is generated if missing in the UUID properties.     * The node identifier is made of six bytes.     */    private static byte[] _nodeIdentifierByte;    /**     * Creates and returns a new identifier.     *

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?