java.util.UUID.fromString ne vérifiant pas la longueur
Quand j'ai regardé dans la mise en œuvre de java.util.UUID.fromString
j'ai trouvé qu'il ne recherche pas les UUID de la longueur. Est-il une raison particulière à cela? Il vérifie uniquement les composants séparés par un "-".
String[] components = name.split("-");
if (components.length != 5)
throw new IllegalArgumentException("Invalid UUID string: "+name);
Faut-il également jeter IllegalArgumentException lorsque la longueur n'est pas 36?
Actuellement, sans que la durée de la vérification, les nombres sont automatiquement ajoutés à 0 si elle est inférieure à la longueur de composant ou déplacé si plus. L'inconvénient est que, si on entrait dans un UUID de la chaîne avec un chiffre manquant, il est considéré comme étant valide et précédées de 0. C'est difficile à déboguer.
Par exemple, cette "12345678-1234-1234-1234-123456789ab" devient "12345678-1234-1234-1234-0123456789ab". Notez que le '0'? Et ce "12345678-1234-1234-1234-123456789abcd" devient "12345678-1234-1234-1234-23456789abcd" avec le " 1 " supprimé.
Pour pousser encore plus loin, la chaîne "1-2-3-4-5" sera également considéré comme étant valide et devient "00000001-0002-0003-0004-000000000005".
Edit: Pour préciser ma question, est-ce un bug ou d'une passe sur le but de suivre une norme ou un principe?
source d'informationauteur Adrian M
Vous devez vous connecter pour publier un commentaire.
Seulement, les auteurs d'origine de l'UUID d'une classe pourrait vous dire pourquoi ils ont choisi de ne pas vérifier le composant longueurs dans le fromString méthode, mais je soupçonne qu'ils ont essayé de tenir compte de Postel du droit:
Vous pouvez toujours vérifier l'entrée à l'encontre d'une expression régulière comme celui-ci:
Le comportement de l'UUID.fromString est étrange, je ne suis pas sûr si c'est un bug ou pas, mais voici ce que j'ai fait pour rattraper ces erreurs.
Voici une solution:
Assurez-vous de tester contre
id.equalsIgnoreCase(parsed.toString())
parce queUUID.fromString(id)
renvoie en bas de casse, même si vous passezid
que des majuscules.Une copie de l'ams de la réponse, mais pour scala xD