Java 有没有办法从字符串生成相同的UUID

Java 有没有办法从字符串生成相同的UUID,java,uuid,Java,Uuid,我想知道是否有一种方法可以基于字符串生成相同的UUID。 我尝试使用UUID,但它似乎不提供此功能。您可以通过这种方式使用UUID为输入字符串获取相同的UUID: String aString="JUST_A_TEST_STRING"; String result = UUID.nameUUIDFromBytes(aString.getBytes()).toString(); UUID.nameuidfrombytes()生成MD5 UUID。如果向后兼容性不是问题,则SHA1优先于MD5

我想知道是否有一种方法可以基于
字符串生成相同的UUID。

我尝试使用UUID,但它似乎不提供此功能。

您可以通过这种方式使用UUID为输入字符串获取相同的UUID:

 String aString="JUST_A_TEST_STRING";
 String result = UUID.nameUUIDFromBytes(aString.getBytes()).toString();

UUID.nameuidfrombytes()
生成MD5 UUID。如果向后兼容性不是问题,则SHA1优先于MD5

此实用程序类同时生成MD5和SHA1 UUID。它还支持名称空间。请随意使用和分享

打包您的.package.name;
导入java.nio.charset.StandardCharset;
导入java.security.MessageDigest;
导入java.security.NoSuchAlgorithmException;
导入java.util.UUID;
/**
*创建UUIDv3(MD5)和UUIDv5(SHA1)的实用程序类。
*
*/
公共类HashUuidCreator{
//域名系统
公共静态最终UUID名称空间_DNS=新UUID(0x6BA7B8109DAD1L,0x80b400c04fd430c8L);
//统一资源定位器
公共静态最终UUID命名空间_URL=新UUID(0x6BA7B8119DAD11L,0x80b400c04fd430c8L);
//ISO对象ID
公共静态最终UUID命名空间_ISO_OID=新UUID(0x6BA7B8129DAD11L,0x80b400c04fd430c8L);
//X.500可分辨名称
公共静态最终UUID命名空间_X500_DN=新UUID(0x6BA7B8149DAD11L,0x80b400c04fd430c8L);
私有静态最终int版本_3=3;//UUIDv3 MD5
私有静态最终int版本_5=5;//UUIDv5-SHA1
私有静态最终字符串消息\u DIGEST\u MD5=“MD5”//UUIDv3
私有静态最终字符串消息\u DIGEST\u SHA1=“SHA-1”//UUIDv5
私有静态UUID getHashUuid(UUID名称空间、字符串名称、字符串算法、int版本){
最终字节[]散列;
最终消息摘要哈希器;
试一试{
//为所选算法实例化消息摘要
hasher=MessageDigest.getInstance(算法);
//如果不为空,请插入名称空间
if(名称空间!=null){
update(toBytes(namespace.getMostSignificantBits());
update(toBytes(namespace.getLeastSignificantBits());
}
//生成散列
hash=hasher.digest(name.getBytes(StandardCharsets.UTF_8));
//将哈希拆分为两部分:MSB和LSB
long msb=toNumber(散列,0,8);//msb的前8个字节
long lsb=toNumber(散列,8,16);//lsb的最后8个字节
//应用版本和变量位(符合RFC-4122要求)
msb=(msb&0xFFFFFFFF0FFFL)|(版本&0x0f)>>56,(字节)(数字>>48),(字节)(数字>>40),
(字节)(数字>>>32),(字节)(数字>>24),(字节)(数字>>16),(字节)(数字>>8),
(字节)(数字)};
}
专用静态长toNumber(最终字节[]字节,最终整数开始,最终整数长度){
长结果=0;
对于(int i=开始;i<长度;i++){

result=(result如果您正在寻找一个Javascript替代方案,请查看哪个还提供了使用SHA-1或MD5哈希函数的选项。

您应该使用UUID v5。

版本3和版本5 UUID是通过对名称空间标识符和名称进行散列生成的。版本3使用MD5作为散列算法,版本5使用SHA-1.-wikipedia

UUID v5需要一个名称空间,它基本上就像一个随机种子。但在应用程序中,它应该是一个常量,以确保相同的输入总是产生相同的输出。名称空间应该是一个UUID v4,您可以使用它

可以找到UUID v5的可能实现:


任何js等价物?@mika在某种程度上是等价的。您可以为给定的命名空间+字符串生成相同的UUID。您可以执行以下操作:
UUID::uuid3(UUID::namespace_DNS,'TEST string')->toString()
在本例中使用md5哈希。是否有任何方法可以将此UUID解码为原始字符串?从给定字符串生成的UUID与从另一个字符串生成的UUID冲突的可能性有多大?@Groppe非常小,类似于md5(UUIDv3)或SHA1(UUIDv5)的可能性给定字符串的哈希冲突为什么您认为在生成UUID时应该首选SHA1而不是MD5?我不认为应该总是首选SHA1。这取决于具体情况。RFC-4122在其第4.3节中说,如果向后兼容性不是问题,则首选SHA-1。我会修正我的评论。谢谢。
// Java's generator
UUID.nameUUIDFromBytes():      '9e120341-627f-32be-8393-58b5d655b751'

// This generator
HashUuidCreator.getMd5Uuid():  '9e120341-627f-32be-8393-58b5d655b751'
HashUuidCreator.getSha1Uuid(): 'e4586bed-032a-5ae6-9883-331cd94c4ffa'

// This generator WITH name space
HashUuidCreator.getMd5Uuid():  '2b098683-03c9-3ed8-9426-cf5c81ab1f9f'
HashUuidCreator.getSha1Uuid(): '1ef568c7-726b-58cc-a72a-7df173463bbb'
<!-- https://search.maven.org/artifact/com.github.f4b6a3/uuid-creator -->
<dependency>
  <groupId>com.github.f4b6a3</groupId>
  <artifactId>uuid-creator</artifactId>
  <version>3.6.0</version>
</dependency>
UUID namespace = ; // todo generate a UUID v4.
String input = "input";
UUID uuid = UuidCreator.getNameBasedSha1(namespace, input);