2014-06-11 10 views
5

Microsoft's documentation on NEWSEQUENTIALID के अनुसार, NEWSEQUENTIALID का आउटपुट अनुमानित है। लेकिन अनुमानित अनुमानित क्या है? मान लें कि मेरे पास एक GUID है जो NEWSEQUENTIALID द्वारा उत्पन्न किया गया था, यह कितना मुश्किल होगा:अनुमानित पूर्वानुमान कितना अनुमानित है?

  • अगले मूल्य की गणना करें?
  • पिछले मूल्य की गणना करें?
  • पहले मूल्य की गणना करें?
  • किसी भी GUID को जानने के बिना भी पहले मान की गणना करें?
  • पंक्तियों की मात्रा की गणना करें? जैसे पूर्णांक का उपयोग करते समय, /order?id=842 मुझे बताता है कि आवेदन में 842 ऑर्डर हैं।

नीचे कुछ पृष्ठभूमि जानकारी है जो मैं कर रहा हूं और विभिन्न ट्रेडऑफ क्या हैं।

सुरक्षा प्राथमिक कुंजी के रूप में GUID के पूर्ण पूर्णांक का उपयोग करने के लाभ यह है कि GUID का अनुमान लगाना मुश्किल है। जैसे कहें कि हैकर /user?id=845 जैसे यूआरएल को देखता है, वह /user?id=0 तक पहुंचने का प्रयास कर सकता है, क्योंकि यह संभव है कि डेटाबेस में पहला उपयोगकर्ता एक प्रशासनिक उपयोगकर्ता है। इसके अलावा, सभी उपयोगकर्ताओं को तेज़ी से इकट्ठा करने के लिए एक हैकर /user?id=0..1..2 से अधिक हो सकता है।

इसी प्रकार, गोपनीयता पूर्णांक के नकारात्मक पक्ष यह है कि वे जानकारी को रिसाव करते हैं। /order?id=482 मुझे बताता है कि इसके कार्यान्वयन के बाद से वेब शॉप में 482 ऑर्डर हैं।

दुर्भाग्यवश, GUID के प्राथमिक कुंजी के रूप में उपयोग करने से प्रदर्शन डाउनसाइड्स है। इस अंत तक, SQL सर्वर ने NEWSEQUENTIALID फ़ंक्शन पेश किया। इस सवाल में, मैं जानना चाहता हूं कि NEWSEQUENTIALID का आउटपुट कितना अनुमानित है।

उत्तर

3

अंतर्निहित ओएस समारोह UuidCreateSequential है। मान आपके नेटवर्क कार्ड मैक पते और per-os-boot incremental value में से एक से लिया गया है। RFC4122 देखें। परिणाम क्रमबद्ध करने के लिए SQL सर्वर कुछ byte-shuffling करता है। तो मूल्य एक अर्थ में, अत्यधिक अनुमानित है। विशेष रूप से, यदि आप एक मूल्य जानते हैं तो आप तुरंत समान मूल्य की एक श्रृंखला की भविष्यवाणी कर सकते हैं।

हालांकि कोई id=0 के बराबर भविष्यवाणी नहीं कर सकता है, और न ही यह अनुमान लगा सकता है कि 52DE358F-45F1-E311-93EA-00269E58F20D का मतलब है कि स्टोर कम से कम 482 आइटम बेचे गए हैं।

एकमात्र 'अनुमोदित' यादृच्छिक पीढ़ी CRYPT_GEN_RANDOM है (जो CryptGenRandom लपेटती है) लेकिन यह स्पष्ट रूप से एक भयानक महत्वपूर्ण उम्मीदवार है।

+0

उत्कृष्ट और पूरी प्रतिक्रिया! –

1

• अगले मूल्य की गणना करें? हाँ

माइक्रोसॉफ्ट का कहना है:

तो गोपनीयता चिंता का विषय है, इस सुविधा का उपयोग नहीं करते। अगली जेनरेट की गई GUID के मान का आकलन करना संभव है और इसलिए, उस GUID से जुड़े डेटा तक पहुंचें।

तो यह अगले मूल्य प्राप्त करने की संभावना है। यदि प्रीवोयस एक प्राप्त करना संभव है तो मुझे जानकारी नहीं मिलती है।

से: http://msdn.microsoft.com/en-us/library/ms189786.aspx

संपादित करें: NEWSEQUENTIALID और सुरक्षा के बारे में एक और कुछ शब्द: http://vadivel.blogspot.com/2007/09/newid-vs-newsequentialid.html

संपादित करें: NewSequentialID सर्वर का MAC पता (या उनमें से एक), इसलिए एक अनुक्रमिक आईडी जानते हुए भी शामिल देता है एक संभावित हमलावर जानकारी जो सुरक्षा या डीओएस हमले के हिस्से के रूप में उपयोगी हो सकती है। से: Are there any downsides to using NewSequentialID?

+0

आपके उत्तर के लिए धन्यवाद। मुझे पता है कि NEWSEQUENTIALID अनुमानित है।इस सवाल में, मैं * कैसे * पूर्वानुमानित पता लगाना चाहता हूं। –

4

ज्यादातर मामलों में, अगले newsequentialid को वर्तमान मूल्य लेने और पहली हेक्स जोड़ी में जोड़ने के द्वारा भविष्यवाणी की जा सकती है।

दूसरे शब्दों में:

1E 29E599-45F1-E311-80CA-00155D008B1C

1F 29E599-45F1-E311- द्वारा पीछा किया जाता 80 सीए -00155D008B1C

कभी कभी, अनुक्रम एक नया मान से पुनः आरंभ करेगा

29E599-45F1-E311-80CA-00155D008B1C

द्वारा पीछा किया। इस समय में

DECLARE @tbl TABLE (
    PK uniqueidentifier DEFAULT NEWSEQUENTIALID(), 
    Num int 
) 
INSERT INTO @tbl(Num) values(1),(2),(3),(4),(5) 
select * from @tbl 

मेरी मशीन पर है परिणाम:

इसलिए, यह बहुत उम्मीद के मुताबिक

NewSequentialID है खिड़कियों समारोह के चारों ओर एक आवरण UuidCreateSequential

+0

मैंने अपने डेटाबेस में समान व्यवहार देखा है। पंक्तियों की एक श्रृंखला एक पैटर्न का पालन करने लगती है लेकिन फिर अचानक एक नए मूल्य पर कूद जाती है। क्या यह नया मूल्य अनुमान लगाया जा सकता है? –

2

आप इस कोड की कोशिश कर सकते है

PK          Num 
52DE358F-45F1-E311-93EA-00269E58F20D 1 
53DE358F-45F1-E311-93EA-00269E58F20D 2 
54DE358F-45F1-E311-93EA-00269E58F20D 3 
55DE358F-45F1-E311-93EA-00269E58F20D 4 
56DE358F-45F1-E311-93EA-00269E58F20D 5 

आपको इसे सेव करने की कोशिश करनी चाहिए व्यवहार को अलग करने के लिए अलग-अलग समय/तिथि में राल टाइम्स। मैंने इसे कई बार चलाने की कोशिश की और पहला भाग हर बार बदल रहा है (आप परिणाम में देख रहे हैं: 52 ..., 53 ..., 54 ..., आदि ...)। मैंने इसे जांचने के लिए कुछ समय इंतजार किया, और कुछ समय बाद दूसरा भाग भी बढ़ गया। मुझे लगता है कि सभी भागों में उत्थान जारी है। असल में यह ग्रिड में परिवर्तित +=1 इंजेक्शन की तरह दिखता है।

संपादित करें:

आप अनुक्रमिक GUID चाहते हैं और आप मान पर नियंत्रण है चाहते हैं, आप Sequences उपयोग कर सकते हैं।

नमूना कोड:

select cast(cast(next value for [dbo].[MySequence] as varbinary(max)) as uniqueidentifier) 
+0

तब उपयोग क्या है? क्यों न सिर्फ 1,2,3,4,5 का उपयोग करें? –

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