#uuid "5231b533-ba17-4787-98a3--6ren">
gpt4 book ai didi

java - 从没有破折号的字符串创建 UUID

转载 作者:IT老高 更新时间:2023-10-28 20:44:47 25 4
gpt4 key购买 nike

如何从没有破折号的字符串创建 java.util.UUID?

"5231b533ba17478798a3f2df37de2aD7" => #uuid "5231b533-ba17-4787-98a3-f2df37de2aD7"

最佳答案

tl;博士

java.util.UUID.fromString(
"5231b533ba17478798a3f2df37de2aD7"
.replaceFirst(
"(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)", "$1-$2-$3-$4-$5"
)
).toString()

5231b533-ba17-4787-98a3-f2df37de2ad7

或者解析hexadecimal的每一半字符串为 long 整数,并传递给 constructor of UUID .

UUID uuid = new UUID ( long1 , long2 ) ; 

位,而不是文本

一个 UUID是一个 128 位的值。 UUID 不是实际上由字母和数字组成,它是由位组成的。您可以将其视为描述一个非常非常大的数字。

我们可以将这些位显示为 128 个 01 字符。

0111 0100 1101 0010 0101 0001 0101 0110 0110 0000 1110 0110 0100 0100 0100 1100 1010 0001 0111 0111 1010 1001 0110 1110 0110 0111 1110 1100 1111 1100 0101 1111

人类不容易读取位,因此为方便起见,我们通常将 128 位值表示为 hexadecimal由字母和数字组成的字符串。

74d25156-60e6-444c-a177-a96e67ecfc5f

这样的十六进制字符串不是 UUID 本身,只是一种人性化的表示。连字符是按照 UUID 规范作为规范格式添加的,但是是可选的。

74d2515660e6444ca177a96e67ecfc5f

顺便说一句,UUID 规范明确规定,在生成十六进制字符串时必须使用小写字母,而大写字母应该可以作为输入。不幸的是,许多实现都违反了小写生成规则,包括来自 Apple、Microsoft 和其他公司的实现。见 my blog post .


以下是指 Java,而不是 Clojure。

在 Java 7(及更早版本)中,您可以使用 java.util.UUID类基于以连字符作为输入的十六进制字符串实例化 UUID。示例:

java.util.UUID uuidFromHyphens = java.util.UUID.fromString("6f34f25e-0b0d-4426-8ece-a8b3f27f4b63");
System.out.println( "UUID from string with hyphens: " + uuidFromHyphens );

但是,该 UUID 类在输入 没有 连字符的十六进制字符串时失败。这个失败是不幸的,因为 UUID 规范确实 not 需要以十六进制字符串表示的连字符。这失败了:

java.util.UUID uuidFromNoHyphens = java.util.UUID.fromString("6f34f25e0b0d44268ecea8b3f27f4b63");

正则表达式

一种解决方法是格式化十六进制字符串以添加规范连字符。这是我尝试使用正则表达式格式化十六进制字符串。当心...此代码有效,但我不是正则表达式专家。你应该让这段代码更健壮,比如在格式化之前检查字符串的长度是 32 个字符,之后是 36 个字符。

    // -----|  With Hyphens  |----------------------
java.util.UUID uuidFromHyphens = java.util.UUID.fromString( "6f34f25e-0b0d-4426-8ece-a8b3f27f4b63" );
System.out.println( "UUID from string with hyphens: " + uuidFromHyphens );
System.out.println();

// -----| Without Hyphens |----------------------
String hexStringWithoutHyphens = "6f34f25e0b0d44268ecea8b3f27f4b63";
// Use regex to format the hex string by inserting hyphens in the canonical format: 8-4-4-4-12
String hexStringWithInsertedHyphens = hexStringWithoutHyphens.replaceFirst( "([0-9a-fA-F]{8})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]+)", "$1-$2-$3-$4-$5" );
System.out.println( "hexStringWithInsertedHyphens: " + hexStringWithInsertedHyphens );
java.util.UUID myUuid = java.util.UUID.fromString( hexStringWithInsertedHyphens );
System.out.println( "myUuid: " + myUuid );

Posix 表示法

您可能会发现这种替代语法更具可读性,在正则表达式中使用 Posix 表示法,其中 \\p{XDigit} 代替 [0-9a-fA-F](参见 Pattern 文档):

String hexStringWithInsertedHyphens =  hexStringWithoutHyphens.replaceFirst( "(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)", "$1-$2-$3-$4-$5" );

完整示例。

java.util.UUID uuid =
java.util.UUID.fromString (
"5231b533ba17478798a3f2df37de2aD7"
.replaceFirst (
"(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}+)",
"$1-$2-$3-$4-$5"
)
);

System.out.println ( "uuid.toString(): " + uuid );

uuid.toString(): 5231b533-ba17-4787-98a3-f2df37de2ad7

关于java - 从没有破折号的字符串创建 UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com