"123438e1036d-7527-42a3-98ca-f2f19d3155db"
Ce n'est pas un UUID. C'est une chaîne concaténée de "1234" et d'un UUID. Le problème ici est que l'analyseur aurait dû vous le dire en lançant une exception. Au lieu de cela, il fait de son mieux pour en fait trouver l'UUID enfoui quelque part.
Une fois que vous extrayez l'UUID de votre chaîne concaténée, il est identique au premier UUID, ce qui est le résultat correct que vous observez.
Nous pouvons analyser l'analyseur (merci à @tim-biegeleisen pour avoir fourni le lien) :
public static UUID fromString(String name) {
String[] components = name.split("-");
if (components.length != 5)
throw new IllegalArgumentException("Chaîne UUID invalide : "+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);
}
Comme on peut le voir, il n'y a aucune validation sauf pour compter le nombre de groupes limités par des tirets. Il prend simplement ces groupes et les déplace ensuite dans les positions. Vous avez ajouté des caractères supplémentaires devant le premier groupe, qui est la partie la plus significative. Cela est analysé et stocké en premier, puis il est décalé vers le haut et encore vers le haut jusqu'à ce qu'il occupe la partie la plus significative. Maintenant, tous les bits qui étaient plus à gauche que prévu sont poussés hors de la limite du long
, donc ils sont complètement ignorés.