Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

विभिन्न एल्गोरिदम का उपयोग करके यूयूआईडी टकराव का जोखिम

टक्करों का जोखिम थोड़ा बढ़ जाता है लेकिन फिर भी गायब हो जाता है। उस पर विचार करें:

  • कंघी और NEWID दोनों /NEWSEQUENTIALID कुछ एमएस तक की सटीकता के साथ टाइमस्टैम्प शामिल करें। इस प्रकार, जब तक कि आप ठीक उसी क्षण . पर बड़ी संख्या में आईडी जनरेट नहीं कर रहे हैं इन सभी विभिन्न स्रोतों से, यह सचमुच असंभव है आईडी टकराने के लिए।

  • GUID का वह भाग जो नहीं है टाइमस्टैम्प के आधार पर यादृच्छिक के रूप में सोचा जा सकता है; अधिकांश GUID एल्गोरिदम इन अंकों को PRNG पर आधारित करते हैं। इस प्रकार, इन अन्य 10 बाइट्स या तो के बीच टकराव की संभावना उसी क्रम पर है जैसे कि आपने दो अलग-अलग यादृच्छिक संख्या जेनरेटर का उपयोग किया और टकराव के लिए देखा।

    एक पल के लिए इसके बारे में सोचें - पीआरएनजी संख्या दोहरा सकते हैं और कर सकते हैं, इसलिए उनमें से दो के बीच टकराव की संभावना उनमें से केवल एक का उपयोग करके टकराव से काफी अधिक नहीं है, भले ही वे थोड़ा अलग एल्गोरिदम का उपयोग करें। यह हर हफ्ते एक ही लॉटरी नंबर खेलना बनाम हर हफ्ते एक यादृच्छिक सेट चुनने जैसा है - जीतने की संभावनाएं बिल्कुल समान हैं।

अब, ध्यान रखें कि जब आप Guid.Comb जैसे एल्गोरिथम का उपयोग करते हैं, तो आपके पास केवल 10 बिट यूनीकफायर होते हैं, जो 1024 अलग-अलग मानों के बराबर होता है। इसलिए यदि आप उन्हीं कुछ मिलीसेकंड में बड़ी संख्या में GUID जेनरेट कर रहे हैं, तो आप करेंगे टकराव प्राप्त करें। लेकिन अगर आप काफी कम आवृत्ति पर GUID उत्पन्न करते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप एक ही समय में कितने अलग-अलग एल्गोरिदम का उपयोग करते हैं, टकराव की संभावना अभी भी व्यावहारिक रूप से न के बराबर है।

आपके लिए पूरी तरह से निश्चित होने का सबसे अच्छा तरीका एक परीक्षण चलाना है; सभी 2 या 3 (या जितने भी आप उपयोग करते हैं) GUID उत्पन्न करते हैं, एक ही समय में, नियमित अंतराल पर, और उन्हें एक लॉग फ़ाइल में लिखें, और देखें कि क्या आपको टक्कर मिलती है (और यदि हां, तो कितने)। इससे आपको अंदाजा हो जाएगा कि व्यवहार में यह कितना सुरक्षित है।

पी.एस. यदि आप क्लस्टर प्राथमिक कुंजी के लिए GUID उत्पन्न करने के लिए NHibernate के कंघी जनरेटर का उपयोग कर रहे हैं, तो NEWSEQUENTIALID() का उपयोग करने पर विचार करें। NEWID() . के बजाय - कॉम्ब का संपूर्ण बिंदु पृष्ठ विभाजन से बचने के लिए है, और यदि आपके पास गैर-अनुक्रमिक एल्गोरिदम का उपयोग करने वाली अन्य प्रक्रियाएं हैं तो आप इसे पूरा नहीं कर रहे हैं। आपको Guid.NewGuid . का उपयोग करके कोई भी कोड बदलना चाहिए समान कॉम्ब जनरेटर का उपयोग करने के लिए - NHibernate में उपयोग किया जाने वाला वास्तविक कॉम्ब एल्गोरिथ्म जटिल नहीं है और आपके अपने डोमेन लॉजिक में डुप्लिकेट करना आसान है।

<उप>† ध्यान दें कि NEWID . के बारे में कुछ विवाद प्रतीत होता है , और इसमें टाइमस्टैम्प है या नहीं। किसी भी मामले में, चूंकि यह मैक पते पर आधारित है, इसलिए संभावित मानों की सीमा V4 GUID या Comb से काफी कम है। डेटाबेस के बाहर कॉम्ब GUIDs और NEWSEQUENTIALID से चिपके रहने की अनुशंसा करने के लिए मेरे लिए और कारण डेटाबेस के अंदर।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर सर्वर में नियमित अभिव्यक्तियाँ?

  2. SQL सर्वर में FILEPROPERTY () का उपयोग कैसे करें

  3. पता लगाएँ कि कौन सा ऑपरेटिंग सिस्टम SQL सर्वर चल रहा है (T-SQL उदाहरण)

  4. शीर्ष 5 सुविधाएँ आपके SQL सर्वर डेटाबेस प्रदर्शन निगरानी प्लेटफ़ॉर्म को प्रदान करने की आवश्यकता है

  5. SQL सर्वर में "पंक्ति संस्करण" क्या है?