簡體   English   中英

為什么兩個不同的java.util.UUID對象比較相等?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM