GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。
这篇文章我也是从网上看到的。
package com.toshiba.pyxis.common;
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 GuidCreator
{
private String valueBeforeMD5 = "";
private String valueAfterMD5 = "";
private static Random myRand = null;
private static SecureRandom mySecureRand = null;
private static String s_id = "";
private static final int PAD_BELOW = 0x10;
private static final int TWO_BYTES = 0xFF;
static
{
mySecureRand = new SecureRandom();
long secureInitializer = mySecureRand.nextLong();
myRand = new Random(secureInitializer);
try
{
s_id = InetAddress.getLocalHost().toString();
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
}
public GuidCreator()
{
getRandomGUID(false);
}
public GuidCreator(boolean secure)
{
getRandomGUID(secure);
}
private void getRandomGUID(boolean secure)
{
MessageDigest md5 = null;
StringBuffer sbValueBeforeMD5 = new StringBuffer(128);
try
{
md5 = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
try
{
long time = System.currentTimeMillis();
long rand = secure ? mySecureRand.nextLong() : 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)
{
e.printStackTrace();
}
}
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();
}
}