[英]Why are two different java.util.UUID objects comparing as equal?
我已經創建了兩個java.util.UUID
實例,如下所示。 一個是從UUID.randomUUID()
創建的,另一個是相同的,但前面有一些其他數字。 當使用UUID.equals
方法比較它們時,它返回true
:
UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.fromString("12345"+uuid1.toString());
System.out.println(uuid1.equals(uuid2)); // this gives true.
我認為添加的數字將被丟棄,並且都給出相同的UUID字符串值。 為什么會這樣呢?
在UUID.fromString(...)方法中,您需要執行以下操作:
public static UUID fromString(String name) {
String[] components = name.split("-");
if (components.length != 5)
throw new IllegalArgumentException("Invalid UUID string: "+name);
for (int i=0; i<5; i++)
components[i] = "0x"+components[i];
long mostSigBits = Long.decode(components[0]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[1]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[2]).longValue();
long leastSigBits = Long.decode(components[3]).longValue();
leastSigBits <<= 48;
leastSigBits |= Long.decode(components[4]).longValue();
return new UUID(mostSigBits, leastSigBits);
}
首先要做的是將UUID的各個部分分成多個組件,然后將創建兩個long。 在這里,您通過添加前導字符僅更改了UUID的第一個組件,例如,您的UUID字符串為“ 12345 894ff97a-039b-47fe-8a72-950b7766d50c”。 所以第一個組件是“ 12345 894ff97a”
long mostSigBits = Long.decode(components[0]).longValue();
然后,您將獲得“ 320256540146042”,其實際十六進制表示為“ 12345 894ff97a”,然后進行位操作,將長16位向左移動:
mostSigBits <<= 16;
這將導致“ 2541588541301456896”,其實際十六進制表示為“ 2345 894ff97a0000”(我們將16位移動了4個十六進制字符),然后您開始看到正在發生的事情,看到長格式只有64位,因此將這些位移位時丟失,此處第一個字符“ 1”丟失。 之后,在釋放空間中將添加第二個組件:
mostSigBits |= Long.decode(components[1]).longValue();
這將導致“ 2541588541301457819”,其實際十六進制表示為“ 2345 894ff97a039b”,然后它將再次將長16位向左移動:
mostSigBits <<= 16;
這將導致“ -8552342864911466496”,其實際十六進制表示形式為“ 894ff97a039b0000”,並且由於長的64位大小,因此您的前導字符都丟失了。
我不需要解釋該方法的其余部分(最后,mostSigBits為“ 894ff97a039b47fe”,而minimumSigBits為“ 8a72950b7766d50c”),您已經可以理解,調用UUID.fromString( ..),因為僅考慮了最后8個十六進制字符(32位),其余的將丟失。
因為您沒有創建兩個不同的UUID。
UUID.fromString("12345"+uuid1.toString());
沒有任何意義: UUID.fromString(String)
要求傳遞的String遵循UUID.toString()
所述的“字符串標准表示形式”。 請參閱UUID.fromString()和UUID.toString() 。
我想知道為什么您不會例外,但是我想您的前幾個字符會被忽略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.