• Java生成UUID


    转自:http://www.cnblogs.com/hellojava/archive/2012/12/03/2799953.html

    UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境(Distributed Computing Environment, DCE) 领域的一部份。

    UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。

    UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

    UUID由以下几部分的组合:

    (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
    (2)时钟序列。
    (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
     
    UUID的唯一缺陷在于生成的结果串会比较长。
    关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。

    1、JDK1.5生成UUID

    UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID。

    java.util.UUID生成UUID例子:

    UUID uuid  =  UUID.randomUUID(); 
    String s = UUID.randomUUID().toString();

    UUID是由一个十六位的数字组成,表现出来的形式例如:550E8400-E29B-11D4-A716-446655440000

    2、使用UUID作为数据库主键

    下面就是实现为数据库获取一个唯一的主键id的代码:

    public class UUIDGenerator { 
        public UUIDGenerator() { 
        } 
        /** 
         * 获得一个UUID 
         * @return String UUID 
         */ 
        public static String getUUID(){ 
            String s = UUID.randomUUID().toString(); 
            //去掉“-”符号 
            return s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24); 
        } 
        /** 
         * 获得指定数目的UUID 
         * @param number int 需要获得的UUID数量 
         * @return String[] UUID数组 
         */ 
        public static String[] getUUID(int number){ 
            if(number < 1){ 
                return null; 
            } 
            String[] ss = new String[number]; 
            for(int i=0;i<number;i++){ 
                ss[i] = getUUID(); 
            } 
            return ss; 
        } 
        public static void main(String[] args){ 
            String[] ss = getUUID(10); 
            for(int i=0;i<ss.length;i++){ 
                System.out.println(ss[i]); 
            } 
        } 
    }

    优点

    能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
    保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

    具有一定安全性,别人不会根据INT自增主键判断数据增长状况。

    缺点

    比较占地方,和INT类型相比,存储一个UUID要花费更多的空间。

    插入读取数据效率较低,生成UUID算法也消耗资源。

    转自:http://lavasoft.blog.51cto.com/62575/347354/

    这里,想通过多线程生成UUID测试下,看看是否会重复,效率如何:

    import java.util.UUID; 
    import java.util.concurrent.ExecutorService; 
    import java.util.concurrent.Executors; 
    
    /** 
    * Java的UUID生成工具并发测试 
    * 
    * @author leizhimin 2010-7-10 16:25:13 
    */ 
    public class TestUUID implements Runnable { 
            public static void main(String[] args) { 
                    ExecutorService pool = Executors.newFixedThreadPool(5); 
                    for (int i = 0; i < 8; i++) { 
                            pool.execute(new TestUUID()); 
                    } 
                    pool.shutdown(); 
            } 
    
            public static String genReqID() { 
    //                return UUID.randomUUID().toString().replace("-", "").toUpperCase(); 
                    return UUID.randomUUID().toString().toUpperCase(); 
            } 
    
            public void run() { 
                    for (int i = 0; i < 10; i++) { 
                            System.out.println(genReqID()); 
                    } 
            } 
    }
    20F644DE-23C5-4E04-BE38-991710D2DA13 
    93349C44-D8BA-495E-A687-44AE3FAEA9A5 
    BEB86A25-A9E5-47DC-BC22-157E021EAD3C 
    C990218F-C925-4A41-8006-D4489145CED6 
    767CD9B4-4E6A-4D53-BE96-CF35E6F69D60 
    A3876D8D-E807-492E-9054-28B9289EB5C5 
    17DD2BCD-E710-4F7A-B8F3-6BB19201E15B 
    901CCE61-4E47-4B2B-AA06-22A023D78313 
    81473B2F-FBC1-4D3D-834E-DEFFBD3C510C 
    46980DBD-E6A0-46E6-8FE9-E2E5766C2442 
    0BF83A5F-7A31-44C2-AE7F-EB4281F9CDE0 
    E35383D0-4850-45A1-B764-F8760BF1707B 
    772A2E21-ABAF-47AE-978C-AF70F40313F1 
    0DB815CF-C7B5-4E2F-B2DB-E84BC7B616F8 
    C826D9B7-E1F3-4F8E-8AAF-A61197AAFCCF 
    26CF2391-7C01-43FE-B515-5BD5DA6AF0B3 
    2544396E-D9C3-4D4D-B2CB-2A77107D4167 
    5BED5394-59DA-4E45-8182-34A24E1D2AC2 
    F32F5F1E-6C6F-4C9F-9944-6CE4EC8768F7 
    775F0B36-0965-4BA8-B1AA-FD1CFBE2B718 
    32DA0548-B562-444D-A16A-7E535EAA3C93 
    C935101E-7365-45C5-BBD1-3A64F2EC33C2 
    E623EC45-1F7E-4973-8132-424C134C7096 
    86AFEE47-AFD7-4479-B30D-0C2632087404 
    847F46FA-D112-4CB7-86E4-640F03A1E676 
    FA45ADA6-6A63-4961-B7C5-9501B21E116A 
    3E21CBC8-C116-437A-BAEC-4AD02F711F02 
    6025C077-379D-4458-BBEB-66D47FCF2206 
    09F7872D-90EE-4151-9463-1609200CE615 
    5FB07DF6-BA89-4017-BE9D-592DB6EADF05 
    6D7627AD-347C-4E69-B0A7-3674CCBDEE79 
    1E4E5E7D-AE3F-419F-836E-F284842261A6 
    1FFD670E-EC2C-462A-8E82-DACC21CF153A 
    FB5868EE-5330-4F6D-8CEE-0B1A50156E26 
    A38918F7-FB35-4560-9810-BE0B649E8D20 
    009508E8-0C9B-4189-BB5F-159F7EB2AAB6 
    30132165-0207-40B0-943F-E34B401D724F 
    CA5D15A0-490B-47D7-BF2A-9D58F8742E5B 
    BCE31255-156D-479E-B4EC-949A731B3FF2 
    A6CC370E-AFE0-439A-AFF3-37A76687B259 
    27894607-1CEF-43C2-93FC-75B59CB617A9 
    39ABD92B-D4CE-4B3C-BB70-D94739849DA2 
    04D2E913-75C2-4506-8ED7-5A95F023DCFD 
    FE853E35-72C6-422C-A7C4-CC4C0A4C9A98 
    7A6D6722-BC13-4965-95D4-F35B428E297D 
    92A4831A-A60E-4C16-AD8F-C8AC839436FF 
    9B58249F-3F6F-4434-ACF6-00F51A971243 
    7DDB1ABC-7918-4465-B8E3-0CB59D63F979 
    EF43F137-63D1-4361-BFB6-4A5C51B86C12 
    B785B7FE-FBA4-49B1-ADF8-CFD6107D9DB6 
    68EA68F7-A56B-4DDA-A832-BCD59BF67BA1 
    09F7E3E5-4344-49F7-992B-0E0B33D11296 
    78EEBA04-C836-44ED-829F-6F55E3E758A4 
    A4333A46-482B-47BE-87D0-BC0666EAE8FC 
    38E1212E-3D11-4275-A50C-42D98CEF91C5 
    FD9EDACF-6345-435E-B8A2-D8CDA8A66EE0 
    24925FA8-BB81-4639-BFFA-A12CA99E419F 
    B6994147-4AC2-414C-9669-9DC3E4BE8F88 
    1938E265-B213-46AC-A349-678B7E029771 
    485757B6-7C6E-4CFF-959B-6DF94DC282B6 
    C43E385D-B798-4FE0-8F50-2DCC8370655E 
    19426A29-E2C9-4DAF-A5EE-48131D719D66 
    8773F8F0-45C5-463B-85EB-97E8395CBB81 
    2B5F6CB2-E1F2-44A8-A60E-C8CD4191EE52 
    65775AF5-34C6-491A-8DED-A257E2480C62 
    A6F23801-B2E2-40A4-9415-43797BF14DD8 
    D1E386E3-6BBF-40E0-BF84-E0C41F32B6E7 
    97A836A3-64F9-4FDA-AD78-238CF1B8F413 
    32CE9D3D-EDA1-4E8C-87B9-DBAAD389FBAA 
    F2467331-CC34-49C1-9A3B-7566AE525B3B 
    847C08A3-D8AE-4C66-84F7-28387AD84EA9 
    5E8A99E6-600E-4797-B590-72345106E295 
    6B576614-4F9D-4018-98A8-ECCFDEA045B0 
    27070E60-ACE5-474D-AA47-8A4F37D16742 
    18BB8499-7836-4ACC-A301-167D52AB3D3F 
    8EC342B2-555A-4EAC-A82D-5AC6C7941421 
    5BF92378-7EFD-4454-806C-DFBFE51753C3 
    1A5B0717-07C0-46EA-8F3D-6246C57D9FB1 
    C3C642CE-A05E-496D-85E6-4830CF39970B 
    74B751BF-5CA5-4526-AFB8-2AA467852976 
    
    Process finished with exit code 0
    本来UUID是小写的,我改为大写的了。可以发现一个规律,UUID码是长度相同的,36位字符,如果去掉连接线,正好是32位的。其实完全可以去掉连接线,因为连接线的位置是相同的。
    去掉的方法很简单:
    return UUID.randomUUID().toString().replace("-", "").toUpperCase();
     
    通过上面测试,多线程下,UUID生成速度还是很快的。
  • 相关阅读:
    C++语法小记---string类
    C++语法小记---标准库
    C++语法小记---运算符重载
    C++语法小记---函数重载
    C++语法小记---友元
    C++语法小记---开篇
    STM32使用printf丢失第一个字母的问题
    AD芯片的基准参考电压问题
    运算放大器的调试经验
    [置顶] TIM_GetCounter与TIM_GetCapture1的区别
  • 原文地址:https://www.cnblogs.com/tv151579/p/3053947.html
Copyright © 2020-2023  润新知