"123438e1036d-7527-42a3-98ca-f2f19d3155db"
To nie jest UUID. Jest to połączony ciąg "1234" i UUID. Problem polega na tym, że parser powinien był ci o tym powiedzieć, rzucając wyjątek. Zamiast tego dokłada wszelkich starań, aby znaleźć tam ukryty UUID.
Po wyodrębnieniu identyfikatora UUID z połączonego ciągu jest to identyczne z pierwszym identyfikatorem UUID, który jest prawidłowym wynikiem, który obserwujesz.
Możemy analizować parsera (dzięki @ tim-Biegeleisen za dostarczanie link):
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);
}
Jak widzimy, nie ma walidacji oprócz liczenia liczby grup ograniczonych myślnikami. Po prostu bierze te grupy, a następnie przesuwa je na pozycje. Dodałeś dodatkowe postacie przed pierwszą grupą, która jest najważniejszą częścią. Najpierw jest on przetwarzany i zapisywany, a następnie przesuwa się w górę i ponownie, aż zajmie najważniejszą część. Teraz wszystkie bity, które były dalej niż założono, zostają wypchnięte z limitu long
, dlatego są całkowicie ignorowane.
Jakie wyjście otrzymujesz? Jakiej wydajności oczekujesz? Co się stanie, jeśli wydrukujesz dwa wyniki zamiast ich porównywać? –
Może dlatego, że numery UUID są dokładnie takie same, z wyjątkiem "1234" na początku? Co się stanie, jeśli zmienisz resztę UUID zamiast dodawać 4 cyfry na początku? – n247s
Brzmi jak błąd. Powinien zawierać wyjątek informujący, że nie jest to prawidłowy identyfikator UUID. – immibis