001: /*
002: * CoadunationLib: The coaduntion implementation library.
003: * Copyright (C) 2006 Rift IT Contracting
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
018: *
019: * ThreadPermissionSession.java
020: *
021: * This object is responsible for generating a random guid. It is a copy of a
022: * class found at http://javaexchange.com/aboutRandomGUID.html. With some
023: * modifications to support Coadunation better.
024: */
025:
026: // package
027: package com.rift.coad.lib.common;
028:
029: // java
030: import com.rift.coad.lib.common.*;
031: import java.net.InetAddress;
032: import java.net.UnknownHostException;
033: import java.security.SecureRandom;
034: import java.security.MessageDigest;
035:
036: /**
037: * This object is responsible for generating a random guid. It is a copy of a
038: * class found at http://javaexchange.com/aboutRandomGUID.html. With some
039: * modifications to support Coadunation better.
040: *
041: * @author Marc (copied from http://javaexchange.com/aboutRandomGUID.html)
042: */
043: public class RandomGuid {
044:
045: // singleton member variables
046: private static SecureRandom mySecureRand;
047:
048: // private member variables
049: private String s_id = null;
050: public String guid = "";
051:
052: /*
053: * Static block to take care of one time secureRandom seed.
054: * It takes a few seconds to initialize SecureRandom. You might
055: * want to consider removing this static block or replacing
056: * it with a "time since first loaded" seed to reduce this time.
057: * This block will run only once per JVM instance.
058: */
059:
060: static {
061: mySecureRand = new SecureRandom();
062: }
063:
064: /*
065: * Default constructor. With no specification of security option,
066: * this constructor defaults to lower security, high performance.
067: *
068: * @exception Exception
069: */
070: private RandomGuid() throws Exception {
071: try {
072: s_id = InetAddress.getLocalHost().toString();
073: } catch (UnknownHostException ex) {
074: throw new Exception(
075: "Failed to retrieve the host information ["
076: + ex.getMessage(), ex);
077: }
078:
079: // generate the random guid
080: generateRandomGUID();
081: }
082:
083: /**
084: * This method returns a random guid object.
085: *
086: * @return The reference to the instance of the random guid.
087: * @exception Exception
088: */
089: public static RandomGuid getInstance() throws Exception {
090: return new RandomGuid();
091: }
092:
093: /*
094: * This method generates the random GUID string
095: *
096: * @exception Exception
097: */
098: private void generateRandomGUID() throws Exception {
099: try {
100: StringBuffer sbValueBeforeMD5 = new StringBuffer();
101: // init the md5 hash
102: MessageDigest md5 = null;
103: md5 = MessageDigest.getInstance("MD5");
104:
105: long time = new java.util.Date().getTime();
106: String rand = "";
107:
108: // generate the random value
109: synchronized (mySecureRand) {
110: for (int count = 0; count < 20; count++) {
111: rand += Long.toString(mySecureRand.nextLong());
112: }
113: }
114:
115: // This StringBuffer can be a long as you need; the MD5
116: // hash will always return 128 bits. You can change
117: // the seed to include anything you want here.
118: // You could even stream a file through the MD5 making
119: // the odds of guessing it at least as great as that
120: // of guessing the contents of the file!
121: sbValueBeforeMD5.append(s_id);
122: sbValueBeforeMD5.append(":");
123: sbValueBeforeMD5.append(Long.toString(time));
124: sbValueBeforeMD5.append(":");
125: sbValueBeforeMD5.append(rand);
126:
127: // generate the md5 hash value.
128: String valueBeforeMD5 = sbValueBeforeMD5.toString();
129: md5.update(valueBeforeMD5.getBytes());
130: byte[] array = md5.digest();
131: StringBuffer sb = new StringBuffer();
132: for (int j = 0; j < array.length; ++j) {
133: int b = array[j] & 0xFF;
134: if (b < 0x10)
135: sb.append('0');
136: sb.append(Integer.toHexString(b));
137: }
138:
139: guid = sb.toString();
140: } catch (Exception ex) {
141: throw new Exception("Failed to generate the GUID : "
142: + ex.getMessage(), ex);
143: }
144: }
145:
146: /**
147: * This method returns the guid value.
148: *
149: * @return The string containing the guid value.
150: */
151: public String getGuid() {
152: return guid;
153: }
154:
155: /**
156: * Retrieve the string value contained within.
157: *
158: * @return The string value.
159: */
160: public String toString() {
161: return guid;
162: }
163: }
|