GUID की स्ट्रिंग लंबाई क्या है?


361

मैं SQL में एक varchar स्तंभ है कि शामिल करना चाहिए बनाना चाहते हैं N'guid', जबकि guidनेट से एक उत्पन्न GUID (है Guid.NewGuid वर्ग System.Guid -)।

varcharGUID से I की लंबाई कितनी होनी चाहिए? क्या यह एक स्थिर लंबाई है?

क्या मुझे उपयोग करना चाहिए nvarchar(क्या GUID कभी यूनिकोड वर्ण का उपयोग करेगा)?

varchar(Guid.Length)

पुनश्च। मैं एक SQL रो गाइड डेटा-प्रकार का उपयोग नहीं करना चाहता। मैं बस पूछ रहा हूं कि क्या है Guid.MaxLength


1
नोट: Guid.NewGuidकोई अंतर्निहित "स्ट्रिंग लंबाई" नहीं है; यह सब ToString में प्रयुक्त प्रारूप पर निर्भर करता है (नो-तर्क ToString"D" स्वरूपण का उपयोग करता है)। मैं "बी" पसंद करता हूं क्योंकि यह देखना आसान है कि यह एक GUID है ", लेकिन यह सिर्फ परिचित और सम्मेलन है।

8
क्यों न इसे एक 16byte अद्वितीय पहचानकर्ता के रूप में सहेजा जाए?
फिलिप कोर्नेलिसन

जवाबों:


769

यह इस बात पर निर्भर करता है कि आप गाइड को किस तरह से स्वरूपित करते हैं:

  • Guid.NewGuid().ToString()=> 36 अक्षर (हाइफ़नेटेड)
    आउटपुट:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D")=> 36 वर्ण (हाइफ़न, समान ToString())
    आउटपुट:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N")=> 32 अक्षर (केवल अंक)
    आउटपुट:12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B")=> 38 अक्षर (ब्रेसिज़)
    आउटपुट:{12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P")=> 38 अक्षर (कोष्ठक)
    आउटपुट:(12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X")=> 68 अक्षर (हेक्साडेसिमल)
    आउटपुट:{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}


1
@ शमी - पहले एक 'हाइपनेटेड, डिफॉल्ट जैसा ही' देखें
स्टीवेवेलवेल

2
ओह, तो यह एक एच के साथ 'हाइफ़न' है (मैं डिक्शनरी में देख रहा था और
हाइप

24
मैं जोड़ना चाहूंगा कि एक गाइड 128-बिट अहस्ताक्षरित पूर्णांक है। आप इसे 16-बाइट सरणी के रूप में भी संग्रहीत कर सकते हैं byte[16]
एरिक फाल्केन

3
पीएस, एक और विकल्प है: Guid.NewGuid ()। ToString ("X") => 68 वर्ण आउटपुट: {0x12345678,0x1234,0x1234, {0x12,0x23,0xx,0,0x34,0x56,0x78,0x9a, 0xbc}}
फिलिप कॉर्नेलिसन

4
"एन" विकल्प के साथ केवल 'अंकों' के बारे में टिप्पणी थोड़ी मुश्किल है! आपको इसे ब्रेसिज़ और हाइफ़न के बिना पढ़ना चाहिए
जोवेन

63

36, और GUID केवल 0-9A-F (हेक्सिडेसिमल!) का उपयोग करेंगे।

12345678-1234-1234-1234-123456789012

किसी भी GUID में 36 अक्षर हैं - वे निरंतर लंबाई के हैं। आप यहां GUIDs की पेचीदगियों के बारे में थोड़ा और पढ़ सकते हैं ।

यदि आप ब्रेसिज़ स्टोर करना चाहते हैं तो आपको लंबाई में दो और की आवश्यकता होगी।

नोट: 36 के बीच में डैश के साथ स्ट्रिंग की लंबाई है। वे वास्तव में 16-बाइट संख्या हैं।


1
मुझे लगता है कि एक निरूपण {} से घिरा हुआ है, इसलिए इसका मतलब अधिकतम 38 होगा
मिच गेहूं

3
मुझे पूरा यकीन है कि आपने इसे पहली बार एरिक कहा था। guide.ToString () लंबाई का एक स्ट्रिंग 36 देता है, जिसमें कोई ब्रेसिज़ नहीं होता है।
माइकल पेट्रोत्ता

आप दोनों के लिए धन्यवाद, मुझे क्या चाहिए 36, मैंने कहा कि मैं गाइड की दुकान करना चाहता हूं।
शिम्मी वेइटहैंडलर

7
यह .NET के लिए गलत है; आपको केवल 36 वर्ण मिलते हैं! आपको सी # विज़ुअलाइज़र के लिए ब्रेसिज़ (38 अक्षर) मिलते हैं, लेकिन कोड में नहीं!
स्टेवशिपवेल

मुझे पांडित्य हो रहा है, लेकिन आखिरी 3 अंक एबीसी हो सकते थे। आप वास्तव में यहाँ एक अवसर चूक गए।
एनएच।

32

यहाँ पर सही बात यह है कि इसे स्टोर करना है uniqueidentifier- यह तब डेटाबेस में पूरी तरह से इंडेक्सेबल इत्यादि है। अगला-सर्वश्रेष्ठ विकल्प एक binary(16)कॉलम होगा: मानक GUID लंबाई में ठीक 16 बाइट्स हैं।

यदि आप इसे एक स्ट्रिंग के रूप में संग्रहित करना चाहते हैं, तो लंबाई वास्तव में नीचे आती है कि आप इसे कैसे सांकेतिक शब्दों में बदलना चाहते हैं। हाइक्स के बिना हेक्स (AKA बेस -16 एन्कोडिंग) के रूप में यह 32 अक्षर (बाइट प्रति दो हेक्स) होगा, इसलिए char(32)

हालाँकि, आप हाइफ़न को संग्रहीत करना चाह सकते हैं । यदि आप अंतरिक्ष में कम हैं, लेकिन आपका डेटाबेस मूल रूप से ब्लॉब्स / गाइड का समर्थन नहीं करता है, तो आप बेस 64 एन्कोडिंग का उपयोग कर सकते हैं और ==पैडल प्रत्यय को हटा सकते हैं ; यह आपको 22 अक्षर देता है, इसलिए char(22)। यूनिकोड का उपयोग करने की कोई आवश्यकता नहीं है, और चर-लंबाई की कोई आवश्यकता नहीं है - इसलिए nvarchar(max)एक बुरा विकल्प होगा, उदाहरण के लिए।


क्यों uniqueidentiferपूरी तरह से अनुक्रमित है, लेकिन binary(16)नहीं है?
बाल्टोस्टार

9

मेरा मानना ​​है कि GUIDs 16-बाइट लंबाई (या ASCII hex समतुल्य 32 बाइट्स) के लिए विवश हैं।


5

GUIDs 128bit हैं, या

0 through ffffffffffffffffffffffffffffffff (hex) or 
0 through 340282366920938463463374607431768211455 (decimal) or 
0 through 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 (binary, base 2) or 
0 through 91"<b.PX48m!wVmVA?1y (base 95)

तो हां, 20 मिनट लंबा, जो वास्तव में 4.25 बिट्स से अधिक बर्बाद कर रहा है, इसलिए आप 95 के साथ-साथ छोटे ठिकानों का उपयोग करके भी कुशल हो सकते हैं; आधार 85 सबसे छोटा संभव है जो अभी भी 20 वर्णों में फिट बैठता है:

0 through -r54lj%NUUO[Hi$c2ym0 (base 85, using 0-9A-Za-z!"#$%&'()*+,- chars)

:-)


सिद्धांत रूप में, हाँ। लेकिन आज के विशाल हार्ड डिस्क के साथ, यह कुछ ज्यादा ही व्यावहारिक है जैसे कि varchar (50)। इसलिए यदि आप '1234ABC-ABCD-12AB-34CD-FEDCBA12' जैसे कुछ स्टोर करते हैं, तो आपको इसका अनुवाद करने में पीछे नहीं हटना होगा। आप जो सुझाव दे रहे हैं वह मूल्य को पढ़ने / लिखने की तुलना में थोड़ा अधिक सीपीयू गहन है, जो आप व्यवहार में चाहते हैं।
लॉन्गचैक

3

22 बाइट्स, अगर आप इसे इस तरह करते हैं:

System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');

0

बाइनरी स्ट्रिंग्स स्टोर कच्चे-बाइट डेटा, जबकि कैरेक्टर स्ट्रिंग्स स्टोर टेक्स्ट। बाइनरी डेटा का उपयोग करें जब हेक्सी-दशमलव मानों को संग्रहीत किया जाए SID, GUIDऔर इसी तरह। अद्वितीय पहचानकर्ता डेटा प्रकार में विश्व स्तर पर अद्वितीय पहचानकर्ता या GUID शामिल है। यह मान NEWID () फ़ंक्शन का उपयोग करके प्राप्त होता है जो सभी ऑब्जेक्ट के लिए अद्वितीय मान वापस करने के लिए है। इसे बाइनरी मान के रूप में संग्रहीत किया जाता है लेकिन इसे चरित्र स्ट्रिंग के रूप में प्रदर्शित किया जाता है।

यहाँ एक उदाहरण है।

USE AdventureWorks2008R2;
GO
CREATE TABLE MyCcustomerTable
(
    user_login   varbinary(85) DEFAULT SUSER_SID()
    ,data_value   varbinary(1)
);
GO

INSERT MyCustomerTable (data_value)
    VALUES (0x4F);
GO

निम्न पर लागू होता है: SQL सर्वर निम्न उदाहरण एक यूनीकडिफायर डेटा प्रकार के साथ कस्ट टेबल बनाता है, और डिफ़ॉल्ट मान के साथ तालिका को भरने के लिए NEWID का उपयोग करता है। NEWID () के डिफ़ॉल्ट मान को असाइन करने में, प्रत्येक नई और मौजूदा पंक्ति में CustomerID कॉलम के लिए एक अद्वितीय मूल्य होता है।

-- Creating a table using NEWID for uniqueidentifier data type.  
CREATE TABLE cust  
(  
 CustomerID uniqueidentifier NOT NULL  
   DEFAULT newid(),  
 Company varchar(30) NOT NULL,  
 ContactName varchar(60) NOT NULL,   
 Address varchar(30) NOT NULL,   
 City varchar(30) NOT NULL,  
 StateProvince varchar(10) NULL,  
 PostalCode varchar(10) NOT NULL,   
 CountryRegion varchar(20) NOT NULL,   
 Telephone varchar(15) NOT NULL,  
 Fax varchar(15) NULL  
);  
GO  
-- Inserting 5 rows into cust table.  
INSERT cust  
(CustomerID, Company, ContactName, Address, City, StateProvince,   
 PostalCode, CountryRegion, Telephone, Fax)  
VALUES  
 (NEWID(), 'Wartian Herkku', 'Pirkko Koskitalo', 'Torikatu 38', 'Oulu', NULL,  
 '90110', 'Finland', '981-443655', '981-443655')  
,(NEWID(), 'Wellington Importadora', 'Paula Parente', 'Rua do Mercado, 12', 'Resende', 'SP',  
 '08737-363', 'Brasil', '(14) 555-8122', '')  
,(NEWID(), 'Cactus Comidas para Ilevar', 'Patricio Simpson', 'Cerrito 333', 'Buenos Aires', NULL,   
 '1010', 'Argentina', '(1) 135-5555', '(1) 135-4892')  
,(NEWID(), 'Ernst Handel', 'Roland Mendel', 'Kirchgasse 6', 'Graz', NULL,  
 '8010', 'Austria', '7675-3425', '7675-3426')  
,(NEWID(), 'Maison Dewey', 'Catherine Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL,  
 'B-1180', 'Belgium', '(02) 201 24 67', '(02) 201 24 68');  
GO

एक अतिरिक्त आईडी इंट आइडेंटिटी (1,1) PRIMARY KEY का उपयोग करने के लिए कुछ हद तक अधिक बेहतर है कि एक प्राथमिक कुंजी के बिना एक तालिका परेशानी को आमंत्रित कर रही है। मान लें कि आपके पास एक लाख ग्राहक हैं और आप एक ही लाइन चाहते हैं - WHERE CustomerID = 'xxx' - आप संपूर्ण तालिका को स्कैन करना चाहते हैं या इसे सीधे चाहते हैं? यह दोहरी खोज - ID = 524332 और CustomerID = 'xxx' एक बहुत मजबूत खोज है। यह बहुत तेज़ है, और बहुत सुरक्षित है (कोई भी ब्रूट बल के साथ GUID का अनुमान नहीं लगा सकता है)।
लॉन्गचैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.