`

java中的uuid ,guid算法

 
阅读更多
java中的uuid ,guid算法
import java.io.*;
import java.security.*;
public final class UUID
    implements Serializable, Comparable
{
    private UUID(byte abyte0[])
    {
        version = -1;
        variant = -1;
        timestamp = -1L;
        sequence = -1;
        node = -1L;
        hashCode = -1;
        long l = 0L;
        long l1 = 0L;
       // if(!$assertionsDisabled && abyte0.length != 16)
        //    throw new AssertionError();
        for(int i = 0; i < 8; i++)
            l = l << 8 | (long)(abyte0[i] & 0xff);
        for(int j = 8; j < 16; j++)
            l1 = l1 << 8 | (long)(abyte0[j] & 0xff);
        mostSigBits = l;
        leastSigBits = l1;
    }
    public UUID(long l, long l1)
    {
        version = -1;
        variant = -1;
        timestamp = -1L;
        sequence = -1;
        node = -1L;
        hashCode = -1;
        mostSigBits = l;
        leastSigBits = l1;
    }
    public static UUID randomUUID()
    {
        SecureRandom securerandom = numberGenerator;
        if(securerandom == null)
            numberGenerator = securerandom = new SecureRandom();
        byte abyte0[] = new byte[16];
        securerandom.nextBytes(abyte0);
        abyte0[6] &= 0xf;
        abyte0[6] |= 0x40;
        abyte0[8] &= 0x3f;
        abyte0[8] |= 0x80;
        UUID uuid = new UUID(abyte0);
        return new UUID(abyte0);
    }
    public static UUID nameUUIDFromBytes(byte abyte0[])
    {
        MessageDigest messagedigest;
        try
        {
            messagedigest = MessageDigest.getInstance("MD5");
        }
        catch(NoSuchAlgorithmException nosuchalgorithmexception)
        {
            throw new InternalError("MD5 not supported");
        }
       //juapk.com
        byte abyte1[] = messagedigest.digest(abyte0);
        abyte1[6] &= 0xf;
        abyte1[6] |= 0x30;
        abyte1[8] &= 0x3f;
        abyte1[8] |= 0x80;
        return new UUID(abyte1);
    }
    public static UUID fromString(String s)
    {
        String as[] = s.split("-");
        if(as.length != 5)
            throw new IllegalArgumentException((new StringBuilder())
.append("Invalid UUID string: ").append(s).toString());
        for(int i = 0; i < 5; i++)
            as[i] = (new StringBuilder()).append("0x").append(as[i]).toString();
        long l = Long.decode(as[0]).longValue();
        l <<= 16;
        l |= Long.decode(as[1]).longValue();
        l <<= 16;
        l |= Long.decode(as[2]).longValue();
        long l1 = Long.decode(as[3]).longValue();
        l1 <<= 48;
        l1 |= Long.decode(as[4]).longValue();
        return new UUID(l, l1);
    }
    public long getLeastSignificantBits()
    {
        return leastSigBits;
    }
    public long getMostSignificantBits()
    {
        return mostSigBits;
    }
    public int version()
    {
        if(version < 0)
            version = (int)(mostSigBits >> 12 & 15L);
        return version;
    }
    public int variant()
    {
        if(variant < 0)
            if(leastSigBits >>> 63 == 0L)
                variant = 0;
            else
            if(leastSigBits >>> 62 == 2L)
                variant = 2;
            else
                variant = (int)(leastSigBits >>> 61);
        return variant;
    }
    public long timestamp()
    {
        if(version() != 1)
            throw new UnsupportedOperationException("Not a time-based UUID");
        long l = timestamp;
        if(l < 0L)
        {
            l = (mostSigBits & 4095L) << 48;
            l |= (mostSigBits >> 16 & 65535L) << 32;
            l |= mostSigBits >>> 32;
            timestamp = l;
        }
        return l;
    }
    public int clockSequence()
    {
        if(version() != 1)
            throw new UnsupportedOperationException("Not a time-based UUID");
        if(sequence < 0)
            sequence = (int)((leastSigBits & 0x3fff000000000000L) >>> 48);
        return sequence;
    }
    public long node()
    {
        if(version() != 1)
            throw new UnsupportedOperationException("Not a time-based UUID");
        if(node < 0L)
            node = leastSigBits & 0xffffffffffffL;
        return node;
    }
    public String toString()
    {
        return (new StringBuilder()).append(digits(mostSigBits >> 32, 8)).append("-").append(digits(mostSigBits >> 16, 4))
.append("-").append(digits(mostSigBits, 4)).append("-")
.append(digits(leastSigBits >> 48, 4)).append("-").append(digits(leastSigBits, 12)).toString();
    }
    private static String digits(long l, int i)
    {
        long l1 = 1L << i * 4;
        return Long.toHexString(l1 | l & l1 - 1L).substring(1);
    }
    public int hashCode()
    {
        if(hashCode == -1)
            hashCode = (int)(mostSigBits >> 32 ^ mostSigBits ^ leastSigBits >> 32 ^ leastSigBits);
        return hashCode;
    }
    public boolean equals(Object obj)
    {
        if(!(obj instanceof UUID))
            return false;
        if(((UUID)obj).variant() != variant())
        {
            return false;
        } else
        {
            UUID uuid = (UUID)obj;
            return mostSigBits == uuid.mostSigBits && leastSigBits == uuid.leastSigBits;
        }
    }
    public int compareTo(UUID uuid)
    {
        return mostSigBits >= uuid.mostSigBits ? mostSigBits <= uuid.mostSigBits ? 
leastSigBits >= uuid.leastSigBits ? 
((byte) (((byte)(leastSigBits <= uuid.leastSigBits ? 0 : 1)))) : -1 : 1 : -1;
    }
    private void readObject(ObjectInputStream objectinputstream)
        throws IOException, ClassNotFoundException
    {
        objectinputstream.defaultReadObject();
        version = -1;
        variant = -1;
        timestamp = -1L;
        sequence = -1;
        node = -1L;
        hashCode = -1;
    }
    public int compareTo(Object obj)
    {
        return compareTo((UUID)obj);
    }
    private static final long serialVersionUID = 0xbc9903f7986d852fL;
    private final long mostSigBits;
    private final long leastSigBits;
    private transient int version;
    private transient int variant;
    private volatile transient long timestamp;
    private transient int sequence;
    private transient long node;
    private transient int hashCode;
    private static volatile SecureRandom numberGenerator = null;
   // static final boolean $assertionsDisabled = !UUID.desiredAssertionStatus();
}
直接调用里边方法就得到唯一的串了
分享到:
评论

相关推荐

    java代码生成GUID

    在Java编程语言中,生成全局唯一标识符(GUID,Globally Unique Identifier)通常涉及到使用UUID(Universally Unique Identifier)类。UUID是一个128位的数字,它以一种几乎可以确保全球范围内的唯一性的算法生成。...

    GUID代码生成与算法介绍

    GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。生成算法用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

    JAVA UUID 生成全球唯一ID

    GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复

    Java 生成 UUID通用唯一标识符.docx

    在Java中,UUID由java.util包下的UUID类来实现,它是一个不可变的、不可序列化的类,并且实现了Comparable接口,方便进行比较。 UUID的结构是固定的,总共36个字符,由16进制的数字组成,并用四条短横线分隔成五个...

    java生成UUID通用唯一识别码.docx

    Java中的UUID(Universally Unique Identifier)是一种用于生成全局唯一标识符的标准,由开源软件基金会(OSF)在分布式计算环境中提出。UUID的主要目的是确保在分布式系统中的任何元素都有其独特的识别信息,无需...

    基于Java生成GUID的实现方法

    在Java编程语言中,生成全局唯一标识符(GUID,Globally Unique Identifier)通常通过使用`java.util.UUID`类来实现。GUID是一个128位的数字,通常以16进制的形式展示,用于确保在分布式环境中的唯一性。由于其生成...

    如何生成guid

    Java中,使用`java.util.UUID`类的静态方法`randomUUID()`: ```java UUID guid = UUID.randomUUID(); System.out.println(guid.toString()); ``` 5. **PHP**: PHP中,可以使用`com_create_guid()`函数生成...

    UUID使用总结

    例如,在Java中,可以使用`java.util.UUID`类来生成和操作UUID;在Python中,可以导入`uuid`模块来实现相同功能。在实际应用中,UUID常用于数据库主键、临时文件命名、分布式系统中的唯一标识等场景,避免了命名冲突...

    获取Guid唯一码

    在Java中,没有内置的Guid类,但我们可以使用`java.util.UUID`类来实现相同的功能。`UUID.randomUUID()`方法可以生成一个新的随机UUID: ```java UUID uuid = UUID.randomUUID(); String guidStr = uuid.toString()...

    mysql_guid主键生成方式范例

    在MySQL中,有几种方式可以生成GUID,包括`UUID()`函数和`BIN_TO_UUID()`函数。`UUID()`函数直接生成一个标准的UUID(即GUID),而`BIN_TO_UUID()`则用于将二进制形式的UUID转换为可读的字符串形式。 接下来,我们...

    全球唯一码生成器(GUID)

    在实际应用中,`java.util.UUID`通常已经足够满足需求,但自定义GUID生成器可能在特定场景下有其优势,比如控制生成GUID的结构,或者优化性能(尽管在大多数情况下这不是问题,因为`UUID.randomUUID()`的性能已经...

    UUID完全解析.txt

    2. **不同平台的支持**:包括微软的GUID(Globally Unique Identifiers)、Linux的ext2/ext3文件系统中的LUKS加密功能、GNOME和KDE桌面环境、Mac OS X等都在不同程度上支持UUID。 3. **跨平台性**:UUID的一个重要...

    uuid 资料包

    在实际应用中,我们还可能遇到UUID的变体,如GUID(全局唯一标识符)在Windows系统中常见,它与UUID实际上是一致的,只是不同环境下的叫法。另外,对于隐私保护,一些现代系统倾向于使用Version 4 UUID,以避免包含...

    GUID批量生成器源码.e.rar

    不同的语言有不同的方式来创建和管理GUID,比如.NET框架中的`Guid.NewGuid()`方法,Python的`uuid.uuid4()`函数等。 3. **用户界面**:批量生成器可能有图形用户界面(GUI),允许用户指定生成的数量并以列表或文件...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    guid是一种采用数据库底层的guid算法机制的策略。这种策略对应MYSQL的uuid()函数,SQL Server的newid()函数,ORACLE的rawtohex(sys_guid())函数等。 uuid.hex uuid.hex是一种基于uuid的主键生成策略。这种策略和...

    java面试题

    请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 119 84.12. 请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 ...

    全局唯一ID生成

    全局唯一ID(Global Unique Identifier,简称GUID)在IT系统中扮演着至关重要的角色,尤其是在分布式环境中。当系统需要为每条记录分配一个独一无二的身份标识时,全局唯一ID生成技术就显得尤为重要。本话题将深入...

    base-n-codec-java:BaseN 编码器解码器(Java 版)

    base-n-codec-javaBaseN 编码器/解码器(Java 版) 这个小实用程序库实现了一种编码解码算法,将字节序列编码为(最好是可打印的)字符序列,并将其从该表示解码回字节序列。 它针对相对较短的字节序列(最多约 1000...

    基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    在服务器系统开发中,生成全局唯一ID(Global Unique Identifier,GUID)是一项重要的任务,尤其是在Java游戏服务器中。全局唯一ID的目的是确保在分布式系统中,每个数据实体都能被赋予一个独一无二的标识符,避免...

    sql主键产生器

    3. **UUID/GUID**:在分布式系统中,为了确保全局唯一性,可以使用UUID(通用唯一识别码)或GUID(全局唯一标识符)。每个UUID都是一个128位的数字,通过算法生成,几乎不可能重复。 4. **时间戳**:结合当前日期和...

Global site tag (gtag.js) - Google Analytics