zoukankan      html  css  js  c++  java
  • java 生成GUID

      全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符,一般用16进制表示。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复

    第一种:可以用UUID类来生成GUID

    import java.util.UUID;
    
    public class GuidTest {
        public static void main(String[] args) {
            UUID uuid = UUID.randomUUID();
            System.out.println (uuid);
        }
    }

    输出:

    第二种:直接生成

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.util.Random;
    
    public class GUID {
    
        public String valueBeforeMD5 = "";
        public String valueAfterMD5 = "";
        private static final Random myRand;
        private static final SecureRandom mySecureRand;
        private static String s_id;
    
        static {
            mySecureRand = new SecureRandom();
            long secureInitializer = mySecureRand.nextLong();
            myRand = new Random(secureInitializer);
            try {
                s_id = InetAddress.getLocalHost().toString();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
    
        }
    
        public GUID() {
            getRandomGUID(false);
        }
    
        public GUID(boolean secure) {
            getRandomGUID(secure);
        }
    
        private void getRandomGUID(boolean secure) {
            MessageDigest md5 = null;
            StringBuilder sbValueBeforeMD5 = new StringBuilder();
    
            try {
                md5 = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {
                System.out.println("Error: " + e);
            }
    
            try {
                long time = System.currentTimeMillis();
                long rand = myRand.nextLong();
                if (secure) {
                    rand = mySecureRand.nextLong();
                }
    
                sbValueBeforeMD5.append(s_id);
                sbValueBeforeMD5.append(":");
                sbValueBeforeMD5.append(time);
                sbValueBeforeMD5.append(":");
                sbValueBeforeMD5.append(rand);
    
                valueBeforeMD5 = sbValueBeforeMD5.toString();
                md5.update(valueBeforeMD5.getBytes());
    
                byte[] array = md5.digest();
                StringBuilder sb = new StringBuilder();
                for (byte value : array) {
                    int b = value & 0xFF;
                    if (b < 0x10) sb.append('0');
                    sb.append(Integer.toHexString(b));
                }
                valueAfterMD5 = sb.toString();
            } catch (Exception e) {
                System.out.println("Error:" + e);
            }
        }
    
        public String toString() {
            String raw = valueAfterMD5.toUpperCase();
            return raw.substring(0, 8) +
                    "-" +
                    raw.substring(8, 12) +
                    "-" +
                    raw.substring(12, 16) +
                    "-" +
                    raw.substring(16, 20) +
                    "-" +
                    raw.substring(20);
        }
    
        public static void main(String[] args) {
            GUID guid = new GUID();
            System.out.println(guid);
        }
    }

    输出:

    不积跬步,无以至千里;不积小流,无以成江海
  • 相关阅读:
    c#中使用log4net工具记录日志
    由命名空间函数而引发思考--js中的对象赋值问题
    浅析C#中的Attribute[转]
    剑指offer_输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果
    剑指offer_输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
    剑指offer_输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
    HashSet TreeSet 中元素顺序问题(未解决)
    找出某个String中出现次数最多的字符,并输出次数(字符较长)
    MyBatis、JDBC、Hibernate区别
    String.equals用法注意
  • 原文地址:https://www.cnblogs.com/hzzjj/p/15741060.html
Copyright © 2011-2022 走看看