在Java中创建GUID的最佳方式有哪些?
看看Java 5及以后版本捆绑的[UUID类][1]。
例如: * 如果你想要一个随机的UUID,你可以使用[randomUUID][2]方法。
[1]: http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html [2]: http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html#randomUUID() [3]: http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html#UUID(long,%20long) [4]: http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html#fromString(java.lang.String)
这取决于你想要什么样的UUID。
标准的Java [UID
][2]类可以生成Version 4(随机)UUIDs。
(UPDATE - Version 3(name)UUIDs也可以生成。)它也可以处理其他变体,尽管它不能生成它们。
(在这种情况下,"handle"
意味着从long
、byte[]
或[String
][6]表示法中构造UUID
实例,并提供一些适当的访问器)。)
Java UUID生成器(JUG)][7]的实现声称支持"所有3个'官方'。 [RFC-4122][8]所定义的UUID类型"。 ... 尽管RFC实际上定义了4种类型,并提到了第5种类型。
关于UUID类型和变体的更多信息,在[Wikipedia][9]中有一个很好的总结,血淋淋的细节在[RFC 4122][10]和其他规范中。
1:
[2]: http://docs.oracle.com/javase/8/docs/api/java/util/UUID.html 3:
4:
5:
[6]: https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html#fromString-java.lang.String- [7]: http://wiki.fasterxml.com/JugHome [8]: http://tools.ietf.org/html/rfc4122 [9]: http://en.wikipedia.org/wiki/Uuid [10]: https://tools.ietf.org/html/rfc4122
只是用一个例子来扩展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);
}
}