我想知道是否有一种方法可以基于字符串生成相同的UUID 我尝试使用UUID,它似乎没有提供此功能。
如果您正在寻找Javascript替代方案,请查看uuid-by-string,它还提供了使用SHA-1或MD5哈希函数的选项。
UUID。nameuidfrombytes()方法生成MD5 UUID。如果不存在向后兼容性问题,则首选SHA1而不是MD5。
这是一个生成MD5和SHA1 UUID的实用程序类。它还支持命名空间,UUID. nameUUIDFromBytes()
方法不支持,尽管RFC-4122需要。随意使用和共享。
package com.example;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
/**
* Utility class that creates UUIDv3 (MD5) and UUIDv5 (SHA1).
*
* It is fully compliant with RFC-4122.
*/
public class HashUuidCreator {
// Domain Name System
public static final UUID NAMESPACE_DNS = new UUID(0x6ba7b8109dad11d1L, 0x80b400c04fd430c8L);
// Uniform Resource Locator
public static final UUID NAMESPACE_URL = new UUID(0x6ba7b8119dad11d1L, 0x80b400c04fd430c8L);
// ISO Object ID
public static final UUID NAMESPACE_ISO_OID = new UUID(0x6ba7b8129dad11d1L, 0x80b400c04fd430c8L);
// X.500 Distinguished Name
public static final UUID NAMESPACE_X500_DN = new UUID(0x6ba7b8149dad11d1L, 0x80b400c04fd430c8L);
private static final int VERSION_3 = 3; // UUIDv3 MD5
private static final int VERSION_5 = 5; // UUIDv5 SHA1
private static final String MESSAGE_DIGEST_MD5 = "MD5"; // UUIDv3
private static final String MESSAGE_DIGEST_SHA1 = "SHA-1"; // UUIDv5
private static UUID getHashUuid(UUID namespace, String name, String algorithm, int version) {
final byte[] hash;
final MessageDigest hasher;
try {
// Instantiate a message digest for the chosen algorithm
hasher = MessageDigest.getInstance(algorithm);
// Insert name space if NOT NULL
if (namespace != null) {
hasher.update(toBytes(namespace.getMostSignificantBits()));
hasher.update(toBytes(namespace.getLeastSignificantBits()));
}
// Generate the hash
hash = hasher.digest(name.getBytes(StandardCharsets.UTF_8));
// Split the hash into two parts: MSB and LSB
long msb = toNumber(hash, 0, 8); // first 8 bytes for MSB
long lsb = toNumber(hash, 8, 16); // last 8 bytes for LSB
// Apply version and variant bits (required for RFC-4122 compliance)
msb = (msb & 0xffffffffffff0fffL) | (version & 0x0f) << 12; // apply version bits
lsb = (lsb & 0x3fffffffffffffffL) | 0x8000000000000000L; // apply variant bits
// Return the UUID
return new UUID(msb, lsb);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Message digest algorithm not supported.");
}
}
public static UUID getMd5Uuid(String string) {
return getHashUuid(null, string, MESSAGE_DIGEST_MD5, VERSION_3);
}
public static UUID getSha1Uuid(String string) {
return getHashUuid(null, string, MESSAGE_DIGEST_SHA1, VERSION_5);
}
public static UUID getMd5Uuid(UUID namespace, String string) {
return getHashUuid(namespace, string, MESSAGE_DIGEST_MD5, VERSION_3);
}
public static UUID getSha1Uuid(UUID namespace, String string) {
return getHashUuid(namespace, string, MESSAGE_DIGEST_SHA1, VERSION_5);
}
private static byte[] toBytes(final long number) {
return new byte[] { (byte) (number >>> 56), (byte) (number >>> 48), (byte) (number >>> 40),
(byte) (number >>> 32), (byte) (number >>> 24), (byte) (number >>> 16), (byte) (number >>> 8),
(byte) (number) };
}
private static long toNumber(final byte[] bytes, final int start, final int length) {
long result = 0;
for (int i = start; i < length; i++) {
result = (result << 8) | (bytes[i] & 0xff);
}
return result;
}
/**
* For tests!
*/
public static void main(String[] args) {
String string = "JUST_A_TEST_STRING";
UUID namespace = UUID.randomUUID(); // A custom name space
System.out.println("Java's generator");
System.out.println("UUID.nameUUIDFromBytes(): '" + UUID.nameUUIDFromBytes(string.getBytes()) + "'");
System.out.println();
System.out.println("This generator");
System.out.println("HashUuidCreator.getMd5Uuid(): '" + HashUuidCreator.getMd5Uuid(string) + "'");
System.out.println("HashUuidCreator.getSha1Uuid(): '" + HashUuidCreator.getSha1Uuid(string) + "'");
System.out.println();
System.out.println("This generator WITH name space");
System.out.println("HashUuidCreator.getMd5Uuid(): '" + HashUuidCreator.getMd5Uuid(namespace, string) + "'");
System.out.println("HashUuidCreator.getSha1Uuid(): '" + HashUuidCreator.getSha1Uuid(namespace, string) + "'");
}
}
这是输出:
// 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 (as the standard requires)
HashUuidCreator.getMd5Uuid(): '2b098683-03c9-3ed8-9426-cf5c81ab1f9f'
HashUuidCreator.getSha1Uuid(): '1ef568c7-726b-58cc-a72a-7df173463bbb'
您还可以使用uuid creator库。请参见此示例:
// Create a name based UUID (SHA1)
String name = "JUST_A_TEST_STRING";
UUID uuid = UuidCreator.getNameBasedSha1(name);
项目页面:https://github.com/f4b6a3/uuid-creator
您可以使用UUID这种方式为您的输入字符串获取始终相同的UUID:
String aString="JUST_A_TEST_STRING";
String result = UUID.nameUUIDFromBytes(aString.getBytes()).toString();
问题内容: 我想知道是否有一种方法可以根据 我尝试过的UUID 生成相同的UUID,但它似乎不提供此功能。 问题答案: 您可以通过这种方式使用UUID来为您的输入String始终获取相同的UUID:
我正在将C#脚本移植到Spark(Scala)中,我遇到了Scala中UUID生成与C#中GUID生成的问题。 有没有办法在 Java 中生成与 C# 中生成的 UUID 相同的 UUID? 我通过从字符串的MD5散列创建Guid来生成数据库的主键。最后,我希望在Java/Scala中生成与C#脚本中的UUIDs相匹配的UUIDs,这样数据库中使用C#实现进行散列的现有数据就不需要重新散列。 C#
我想写这样的东西: 默认情况下,[process]方法不能这样做。我可以从文档中了解到,我需要一个特殊的模板解析器: 为了执行模板,将使用过程(String,IContext)方法:最终String结果=templateEngine.process("my模板",ctx);"my模板"String参数是模板名称,它将与模板的物理/逻辑位置相关以在模板解析器处配置自身的方式/s。 有人知道如何解决我
问题内容: 我知道如何使用Runes和种子rand.Init与go生成随机字符串。我的问题是,是否可以(使用stdlib)在不使用当前时间戳(安全)的情况下播种rand? 此外,我问,是因为不仅仅依靠时间来为不安全/脆弱的敏感操作生成随机字符串吗? 问题答案: 对于敏感操作,请使用代替: 软件包[crypto /] rand实现了一种加密安全的随机数生成器。 请注意,您不需要(您不需要)seed
问题内容: 我希望使用番石榴将其连接成一个字符串,但列表中的每个字符串周围都有环绕的字符串。所以我想列出一个字符串列表: 并生成此字符串: 我看到的示例似乎是生成3个以逗号分隔的名称,但我希望每个字符串都包含一些额外的字符串(每次都相同)。 我希望我在这里足够清楚。谢谢你的帮助。 问题答案: 为此,首先要进行转换:
不久前,我有了一个关于“参数化”用户定义文本的想法,并且想知道在当前的C标准中是否有任何方法可以做到这一点。 基本上,这个想法是有一个用户定义的文本,其行为可以根据一些参数进行调整。作为一个简单的例子,我选择了一个“定点”字面值,它将浮点数转换为整数;该参数是小数位数的精度。 这只是一个练习,因为我不确定这在实际应用中是否有用。 我的第一个想法是这样的: 但是,它不会编译,因为类范围中不允许使用名