在Java中创建GUID的最佳方式有哪些?
请看一下捆绑在Java 5及以后版本中的UUID类。
比如说。
这取决于你想要什么样的UUID。
只是用一个例子来扩展Mark Byers'的答案。
import java.util.UUID;
public class RandomStringUUID {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println("UUID=" + uuid.toString() );
}
}
出于安全考虑,在Java内生成UUID][1]值仅限于第4版(随机)。
如果你想要其他版本的UUID,一个途径是让你的Java应用程序到达[JVM][3]之外,通过调用来生成UUID。
uuidgen
][4]。uuid_generate_v1mc()
- 生成版本1的UUID,但使用随机的多播MAC地址代替计算机的真实MAC地址。uuid_generate_v5(namespace uuid, name text)
- 生成版本5的UUID,除了使用SHA-1作为散列方法外,它的工作原理与版本3的UUID相同。[1]: http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html#randomUUID-- 2:
[3]: https://www.google.com/url?sa=t&rc=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0CCIQFjABahUKEwj1jKa_zuDGAhXEEpIKHYwoAQw&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FJava_virtual_machine&ei=kCSoVfWEDcSlyASM0YRg&usg=AFQjCNE6RcWP8IuAXecy2dIl9NayBO_iBg&sig2=0JkiHdYJ1SDk7s65x8N-vA&bvm=bv.97949915,d.aWw。 [4]: http://www.freebsd.org/cgi/man.cgi?query=uuidgen&sektion=1 [5]: [5]:https://en.wikipedia.org/wiki/Java_Database_Connectivity [6]: http://www.postgresql.org/docs/current/static/uuid-ossp.html [7]: http://www.postgresql.org/ 8:
9:
您可以使用这段代码来生成GUID。
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
public class StrictMicroSecondTimeBasedGuid
{
private final static Logger logger = Logger
.getLogger(StrictMicroSecondTimeBasedGuid.class);
private static final long MICRO_IN_MILL = 1000;
private static final long NANO_IN_MICRO = 1000;
private static long baseNanoTime;
private static long baseTimeInMicro;
private static long lastGuid;
static
{
/*
* Nanosecond time's reference is not known, therfore following logic is
* needed to calculate time in micro without knowing refrence point of
* nano time*
*/
baseNanoTime = System.nanoTime();
baseTimeInMicro = System.currentTimeMillis() * MICRO_IN_MILL;
lastGuid = baseTimeInMicro;
}
public static synchronized Long newGuid()
{
long newGuid;
while ((newGuid = calNewTimeInMicro()) <= lastGuid)
{
/** we have to check for this log, we don't want to see log. */
logger.debug("wait of 10-microsecond is introduced to get new guid");
try
{
TimeUnit.MICROSECONDS.sleep(10);
} catch (InterruptedException e)
{
logger.error("Error", e);
}
}
lastGuid = newGuid;
return newGuid;
}
private static long calNewTimeInMicro()
{
return baseTimeInMicro
+ ((System.nanoTime() - baseNanoTime) / NANO_IN_MICRO);
}
}