有了
java.rmi.server.UID
A UID represents an identifier that is unique over time with respect to the host it is generated on, or one of 216  "well-known" identifiers.The UID() constructor can be used to generate an identifier that is unique over time with respect to the host it is generated on. The UID(short) constructor can be used to create one of 216 well-known identifiers.A UID instance contains three primitive values:    * unique, an int that uniquely identifies the VM that this UID was generated in, with respect to its host and at the time represented by the time value (an example implementation of the unique value would be a process identifier), or zero for a well-known UID
    * time, a long equal to a time (as returned by System.currentTimeMillis()) at which the VM that this UID was generated in was alive, or zero for a well-known UID
    * count, a short to distinguish UIDs generated in the same VM with the same time value An independently generated UID instance is unique over time with respect to the host it is generated on as long as the host requires more than one millisecond to reboot and its system clock is never set backward. A globally unique identifier can be constructed by pairing a UID instance with a unique host identifier, such as an IP address. 

解决方案 »

  1.   

    package org.theospi.utils.id.guid;/*
     * RandomGUID
     * @version 1.2.1 11/05/02
     * @author Marc A. Mnich
     *
     * From www.JavaExchange.com, Open Software licensing
     *
     * 11/05/02 -- Performance enhancement from Mike Dubman.
     *             Moved InetAddr.getLocal to static block.  Mike has measured
     *             a 10 fold improvement in run time.
     * 01/29/02 -- Bug fix: Improper seeding of nonsecure Random object
     *             caused duplicate GUIDs to be produced.  Random object
     *             is now only created once per JVM.
     * 01/19/02 -- Modified random seeding and added new constructor
     *             to allow secure random feature.
     * 01/14/02 -- Added random function seeding with JVM run time
     *
     */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 RandomGUID extends Object {
       protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
          .getLog(getClass());   public String valueBeforeMD5 = "";
       public String valueAfterMD5 = "";
       private static Random myRand;
       private static SecureRandom mySecureRand;   private static String s_id;
       private static final int PAD_BELOW = 0x10;
       private static final int TWO_BYTES = 0xFF;   /*
        * Static block to take care of one time secureRandom seed.
        * It takes a few seconds to initialize SecureRandom.  You might
        * want to consider removing this static block or replacing
        * it with a "time since first loaded" seed to reduce this time.
        * This block will run only once per JVM instance.
          */   static {
          mySecureRand = new SecureRandom();
          long secureInitializer = mySecureRand.nextLong();
          myRand = new Random(secureInitializer);
          try {
             s_id = InetAddress.getLocalHost().toString();
          } catch (UnknownHostException e) {
             e.printStackTrace();
          }   }
       /*
        * Default constructor.  With no specification of security option,
        * this constructor defaults to lower security, high performance.
        */
       public RandomGUID() {
          getRandomGUID(false);
       }   /*
        * Constructor with security option.  Setting secure true
        * enables each random number generated to be cryptographically
        * strong.  Secure false defaults to the standard Random function seeded
        * with a single cryptographically strong random number.
        */
       public RandomGUID(boolean secure) {
          getRandomGUID(secure);
       }   /*
        * Method to generate the random GUID
        */
       private void getRandomGUID(boolean secure) {
          MessageDigest md5 = null;
          StringBuffer sbValueBeforeMD5 = new StringBuffer(128);      try {
             md5 = MessageDigest.getInstance("MD5");
          } catch (NoSuchAlgorithmException e) {
             logger.error("Error: " + e);
          }      try {
             long time = System.currentTimeMillis();
             long rand = 0;         if (secure) {
                rand = mySecureRand.nextLong();
             } else {
                rand = myRand.nextLong();
             }
             sbValueBeforeMD5.append(s_id);
             sbValueBeforeMD5.append(":");
             sbValueBeforeMD5.append(Long.toString(time));
             sbValueBeforeMD5.append(":");
             sbValueBeforeMD5.append(Long.toString(rand));         valueBeforeMD5 = sbValueBeforeMD5.toString();
             md5.update(valueBeforeMD5.getBytes());         byte[] array = md5.digest();
             StringBuffer sb = new StringBuffer(32);
             for (int j = 0; j < array.length; ++j) {
                int b = array[j] & TWO_BYTES;
                if (b < PAD_BELOW)
                   sb.append('0');
                sb.append(Integer.toHexString(b));
             }         valueAfterMD5 = sb.toString();      } catch (Exception e) {
             logger.error("Error:" + e);
          }
       }   /*
        * Convert to the standard format for GUID
        * (Useful for SQL Server UniqueIdentifiers, etc.)
        * Example: C2FEEEAC-CFCD-11D1-8B05-00600806D9B6
        */
       public String toString() {
          String raw = valueAfterMD5.toUpperCase();
          StringBuffer sb = new StringBuffer(64);
          sb.append(raw.substring(0, 8));
          sb.append("-");
          sb.append(raw.substring(8, 12));
          sb.append("-");
          sb.append(raw.substring(12, 16));
          sb.append("-");
          sb.append(raw.substring(16, 20));
          sb.append("-");
          sb.append(raw.substring(20));      return sb.toString();
       }/*
         // Demonstraton and self test of class
         public static void main(String args[]) {
           for (int i=0; i< 100; i++) {
             RandomGUID myGUID = new RandomGUID();
             System.out.println("Seeding String=" + myGUID.valueBeforeMD5);
             System.out.println("rawGUID=" + myGUID.valueAfterMD5);
             System.out.println("RandomGUID=" + myGUID.toString());
           }
         }
    */}