Mega Code Archive

 
Categories / Java / Development Class
 

A 32 byte GUID generator

/*************************************************************************  *                                                                       *  *  EJBCA: The OpenSource Certificate Authority                          *  *                                                                       *  *  This software is free software; you can redistribute it and/or       *  *  modify it under the terms of the GNU Lesser General Public           *  *  License as published by the Free Software Foundation; either         *  *  version 2.1 of the License, or any later version.                    *  *                                                                       *  *  See terms of license at gnu.org.                                     *  *                                                                       *  *************************************************************************/ /** Shamelessly ripped from generated XDoclet source, because I don't want to generate util classes.  *   * @author XDoclet.sf.net  * @version $Id: GUIDGenerator.java 5585 2008-05-01 20:55:00Z anatom $  */ public class GUIDGenerator {      /** Cached per JVM server IP. */      private static String hexServerIP = null;      // initialise the secure random instance      private static final java.security.SecureRandom seeder = new java.security.SecureRandom();            /**       * A 32 byte GUID generator (Globally Unique ID). These artificial keys SHOULD <strong>NOT </strong> be seen by the user,       * not even touched by the DBA but with very rare exceptions, just manipulated by the database and the programs.       *       * Usage: Add an id field (type java.lang.String) to your EJB, and add setId(XXXUtil.generateGUID(this)); to the ejbCreate method.       */      public static final String generateGUID(Object o) {          StringBuffer tmpBuffer = new StringBuffer(16);          if (hexServerIP == null) {              java.net.InetAddress localInetAddress = null;              try {                  localInetAddress = java.net.InetAddress.getLocalHost();              } catch (java.net.UnknownHostException uhe) {                  return null;              }              byte serverIP[] = localInetAddress.getAddress();              hexServerIP = hexFormat(getInt(serverIP), 8);          }          String hashcode = hexFormat(System.identityHashCode(o), 8);          tmpBuffer.append(hexServerIP);          tmpBuffer.append(hashcode);          long timeNow      = System.currentTimeMillis();          int timeLow       = (int)timeNow & 0xFFFFFFFF;          int node          = seeder.nextInt();          StringBuffer guid = new StringBuffer(32);          guid.append(hexFormat(timeLow, 8));          guid.append(tmpBuffer.toString());          guid.append(hexFormat(node, 8));          return guid.toString();      }            private static int getInt(byte bytes[]) {          int i = 0;          int j = 24;          for (int k = 0; j >= 0; k++) {              int l = bytes[k] & 0xff;              i += l << j;              j -= 8;          }          return i;      }      private static String hexFormat(int i, int j) {          String s = Integer.toHexString(i);          return padHex(s, j) + s;      }      private static String padHex(String s, int i) {          StringBuffer tmpBuffer = new StringBuffer();          if (s.length() < i) {              for (int j = 0; j < i - s.length(); j++) {                  tmpBuffer.append('0');              }          }          return tmpBuffer.toString();      } }