2012-01-26 12 views
8

मुझे आश्चर्य है कि क्या मैं जावा के UUID.randomUUID() फ़ंक्शन द्वारा उत्पन्न आईड्स के साथ mysql के UUID() फ़ंक्शन से उत्पन्न आईडी को सुरक्षित रूप से प्रतिस्थापित कर सकता हूं?mysql UUID() और जावा UUID.randomUUID()

मैं अपने उपयोगकर्ताओं के साथ यूआरएल में ये आईडी साझा करने के लिए देख रहा हूँ, लेकिन mysql UUID() उत्पादन में कुछ रन के बाद एक दूसरे के बहुत जैसा दिखता है:

3ae2c9c4-47df-11e1-8c2a-a46b34c02a9e 
976de634-47e3-11e1-8c2a-a46b34c02a9e 
530cc5c6-47e7-11e1-8c2a-a46b34c02a9e 
... 

मैं यह नहीं कह रहा हूँ वे ' अद्वितीय नहीं है, लेकिन क्या यह यूयूआईडी() के परिणाम आमतौर पर दिखाई देते हैं? मुझे लगता है कि यह मेरी मशीन पर कुछ पहचानकर्ता से जुड़ा हुआ है।

जावा के UUID.randomUUID() "देखने के लिए" अधिक यादृच्छिक: विशिष्टता की मेरी भोली समझ से

c042437b-298a-41c4-c2b6-0f83552bdb8b 
e33d8ab7-d9d3-4ffe-a592-650a125d2a93 
ecb12c54-5741-45c8-8b85-1825c19a9cae 
... 

, जावा विधि द्वारा उत्पन्न आईडी) mysql के UUID के लिए एक आदर्श प्रतिस्थापन के रूप में काम करना चाहिए (?

धन्यवाद

(जावा के संस्करण का उपयोग कर के लिए एक और बोनस है कि मैं एक डाला रिकॉर्ड है जो UUID() जब मैं एक ग्राहक के लिए प्रत्युत्तर में उपलब्ध कराने की आवश्यकता का उपयोग करता है फिर से लाने के लिए की ज़रूरत नहीं होगी है)

उत्तर

9

क्या आप लिनक्स या फ्रीबीएसडी का उपयोग कर रहे हैं? mysql के से documentation:

पांचवें नंबर है कि स्थानिक विशिष्टता प्रदान करता है एक आईईईई 802 नोड संख्या है। अगर दूसरी स्थिति उपलब्ध नहीं है एक यादृच्छिक संख्या दिया जाता है (उदाहरण के लिए, क्योंकि मेजबान कंप्यूटर कोई ईथरनेट कार्ड है, या हम कैसे अपने ऑपरेटिंग सिस्टम पर एक इंटरफेस के हार्डवेयर का पता लगाने के लिए पता नहीं है)। इस मामले में, स्थानिक विशिष्टता की गारंटी नहीं दी जा सकती है। फिर भी, एक टक्कर बहुत कम संभावना होनी चाहिए।

वर्तमान में, एक अंतरफलक के मैक पता ही FreeBSD और लिनक्स पर ध्यान में रखा जाता है। अन्य ऑपरेटिंग सिस्टम पर, MySQL यादृच्छिक रूप से जेनरेट 48-बिट संख्या का उपयोग करता है।

भी ध्यान रखें:

चेतावनी:

हालांकि UUID() मान अनन्य होने के लिए लक्षित कर रहे हैं, वे जरूरी unguessable या अप्रत्याशित नहीं हैं। यदि अप्रत्याशितता आवश्यक है, तो यूयूआईडी मानों को किसी अन्य तरीके से उत्पन्न किया जाना चाहिए।

संपादित

आप उपयोगकर्ता आईडी चाहते हैं दिखाई अधिक यादृच्छिक, तो आप उन्हें MD5(UUID()) की तरह एक हैशिंग समारोह है, जो एक और अधिक विश्वसनीय यादृच्छिक स्ट्रिंग

+1

मैं पर हूँ देता है के माध्यम से पारित कर सकते हैं एक मैक, और यह बात अंततः एक विंडोज मशीन पर चलने वाला है (...)। मानदंड मेरे लिए कोई मुद्दा नहीं है, जो पैटर्न मैं ऊपर mysql UUID() के साथ देख रहा था, मुझे लगता है कि मेरे उपयोगकर्ता अनुमान लगाएंगे कि इसमें कुछ "अजीब" है।वास्तव में उससे कुछ भी नहीं, लेकिन जावा विधि का उपयोग करके उत्पन्न होने पर सम्मिलन समय पर यूयूआईडी अप-फ्रंट होने का बोनस उस दिशा में अपना पक्ष छोड़ रहा है। धन्यवाद – user291701

संबंधित मुद्दे