2012-03-19 17 views
15

जब मैंने java.util.UUID.fromString के कार्यान्वयन को देखा, तो मुझे पता चला कि यह यूयूआईडी लंबाई की जांच नहीं करता है। क्या इसके लिए कोई विशेष कारण है? यह केवल "-" से अलग घटकों को जांचता है।java.util.UUID.fromString लंबाई की जांच नहीं कर रहा

String[] components = name.split("-"); 
     if (components.length != 5) 
      throw new IllegalArgumentException("Invalid UUID string: "+name); 

यह भी IllegalArgumentException फेंक चाहिए जब लंबाई 36 नहीं है?

वर्तमान में, लंबाई की जांच के बिना, संख्या लंबाई से कम होने पर संख्या 0 के साथ स्वचालित रूप से प्रीपेड की जाती है या यदि अधिक हो तो स्थानांतरित हो जाती है। नकारात्मकता यह है कि, यदि कोई गुम अंकों के साथ यूयूआईडी स्ट्रिंग में प्रवेश करता है, तो इसे वैध के रूप में स्वीकार किया जाता है और 0 के साथ प्रीपेड किया जाता है। इसे डीबग करना मुश्किल है।

उदाहरण के लिए, यह "12345678-1234-1234-1234-123456789ab" बनता है "12345678-1234-1234-1234-ab"। ध्यान दें '0' जोड़ा? और यह "12345678-1234-1234-1234-123456789abcd" बनता है "12345678-1234-1234-1234-23456789abcd" हटाए गए '1' के साथ।

इसे और भी आगे बढ़ाने के लिए, "1-2-3-4-5" स्ट्रिंग को भी मान्य माना जाएगा और "00000001-0002-0003-0004-000000000005" बन जाएगा।

संपादित करें: मेरे प्रश्न को स्पष्ट करने के लिए, क्या यह कुछ मानक या सिद्धांत का पालन करने के उद्देश्य से एक बग या किया गया है?

+2

तो, आपका प्रश्न वास्तव में क्या है? आप जानते हैं कि कैसे UUID.fromString' काम करता है, आपने इसके स्रोत कोड को देखा है। जाहिर है यह भागों की लंबाई की जांच नहीं करता है। तो आप यहां किस तरह के उत्तर की उम्मीद करते हैं? – Jesper

उत्तर

15

केवल UUID वर्ग के मूल लेखकों आप बता सकते हैं कि वे क्यों नहीं fromString विधि में घटक लंबाई की जांच करने का फैसला किया है, लेकिन मुझे लगता है वे Postel's law ध्यान करने के लिए कोशिश कर रहे थे:

आप क्या में उदार बनें स्वीकार करें, और जो आप भेजते हैं उसमें रूढ़िवादी।

तुम हमेशा की तरह इस एक के लिए रेगुलर एक्सप्रेशन के खिलाफ इनपुट की जाँच कर सकते हैं:

[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12} 
+1

शायद यही कारण है कि उन्होंने ऐसा किया लेकिन आईएमओ वे इस मामले में बहुत उदार हैं। –

12

UUID.fromString के व्यवहार अजीब मुझे यकीन है कि नहीं कर रहा हूँ है अगर यह एक बग नहीं है या, लेकिन यहाँ है मैं उन त्रुटियों को पकड़ने के लिए क्या कर रहा हूं।

import java.util.UUID 
import scala.util.control.Exception._ 

val uuId: Option[UUID] = allCatch opt UUID.fromString(uuidToTest) 
require(uuId.isDefined, "invalid UUID") 
+1

सर्वोत्तम अभ्यास कहता है कि आपको केवल असाधारण घटनाओं के लिए अपवादों का उपयोग करना चाहिए। –

+0

यह क्लोजर (ऐसी सुंदर भाषा) में एक-लाइनर है: '(कोशिश करें (= uuid (.toString (UUID/fromString uuid)) (अवैध अवैध पकड़ पकड़ें गलत))' –

-1

एम्स के जवाब की एक प्रति लेकिन स्केला xD

def isValidUuid(uuid: String): Boolean = 
    try uuid != null && UUID.fromString(uuid).toString.equals(uuid) 
    catch { 
     case e: IllegalArgumentException => false 
    } 
1

यहाँ के लिए एक समाधान है ऊपरी मामले के रूप में।

@Component 
public class UuidDtoValidator { 

    public boolean isValidUuid(String id) { 
     if (isBlank(id)) { 
      return false; 
     } 

     try { 
      UUID parsed = UUID.fromString(id); 
      if (parsed.equals(new UUID(0, 0))) { 
       return false; 
      } 
      return id.equalsIgnoreCase(parsed.toString()); 
     } catch (IllegalArgumentException e) { 
      return false; 
     } 
    } 
} 
0

id.equalsIgnoreCase(parsed.toString()) क्योंकि UUID.fromString(id) रिटर्न के खिलाफ लोअर केस भले ही आप id पारित परीक्षण करने के लिए सुनिश्चित करें:

public class UUIDUtils { 
    public static boolean isValid(String uuid){ 
     if(uuid == null) return false; 
     try { 
      // we have to convert to object and back to string because the built in fromString does not have 
      // good validation logic. 
      UUID fromStringUUID = UUID.fromString(uuid); 
      String toStringUUID = fromStringUUID.toString(); 
      return toStringUUID.equals(uuid); 
     } catch(IllegalArgumentException e) { 
      return false; 
     } 
    } 
} 
संबंधित मुद्दे