2010-01-28 6 views
23

Chúng tôi sử dụng GUIDs rộng rãi trong thiết kế cơ sở dữ liệu của mình; Các đối tượng Business Object cung cấp Guid.Empty GUID cho giá trị null của DB và null luôn được lưu vào cơ sở dữ liệu nếu giá trị là Guid.Empty.Có thể GUID được tạo với tất cả các ký tự giống nhau trong .NET không? (e. g .: {11111111-1111-1111-1111-111111111111})

Ngoài số Guid.Empty (00000000-0000-0000-0000-000000000000) khả năng GUID sẽ được tạo với tất cả các ký tự giống nhau e. g .: 11111111-1111-1111-1111-111111111111

Chỉ xem xét sử dụng GUID như thế này cho các giá trị cụ thể.

+7

rất khó: D –

+25

Mặc dù nó cực kỳ khó, chắc chắn có một thiết kế tốt hơn so với chỉ sử dụng GUID cho số ma thuật ?! –

+19

Ở đây tại nơi làm việc, một anh chàng có một GUID trùng lặp một lần; anh ta sẽ không bao giờ giành chiến thắng tại xổ số, như đã dành tất cả may mắn của mình –

Trả lời

65

Nói tóm lại: Đối với GUID tạo theo tiêu chuẩn công bố thông số kỹ thuật và nó chỉ đơn giản không thể xảy ra. GUID có cấu trúc và một số trường thực sự có ý nghĩa. Hơn nữa, .NET tạo GUIDs của phiên bản 4, nơi nó hoàn toàn không thể xảy ra. Chúng được định nghĩa theo cách mà sẽ không có GUID như vậy. Để biết chi tiết, xem bên dưới ;-)


Có 5 đến 7 bit là nguyên nhân chính ở đây. Đó là số nhận dạng phiên bản (bốn bit đầu tiên của phần ba) và trường biến thể chỉ định biến thể của GUID này là gì.

Phiên bản có thể là bất kỳ thứ gì từ 1 đến 5 hiện tại.Vì vậy, chỉ có các chữ số hex hợp lệ mà chúng ta có thể có được như vậy một GUID vào thời điểm này là - rõ ràng - từ 1 đến 5.

Hãy khảo sát tỉ mỉ versions một chút:

  1. địa chỉ MAC và dấu thời gian. Cả hai có thể khó khăn để dỗ vào tất cả các chữ số.
  2. Địa chỉ MAC và dấu thời gian cũng như ID người dùng. Tương tự như đối với v1.
  3. băm MD5. Có thể thậm chí có thể hoạt động.
  4. PRNG. Không bao giờ có thể làm việc vì chữ số đầu tiên của phần thứ tư là luôn là hoặc 8, 9, A hoặc B. Điều này mâu thuẫn với số 4 cho số phiên bản.
  5. băm SHA-1. Có thể thậm chí có thể hoạt động.

Cho đến nay chúng tôi loại trừ phiên bản 4 là không thể, những người khác không chắc chắn. Hãy xem xét trường biến thể.

Các variant field quy định cụ thể một số mẫu bit cho khả năng tương thích ngược (x là một không quan tâm), cụ thể là:

0 x x Reserved. NCS backward compatibility. 
1 0 x The only pattern that currently can appear 
1 1 0 Reserved, Microsoft Corporation backward compatibility 
1 1 1 Reserved for future definition. 

Kể từ khi mô hình này là lúc bắt đầu rất của phần thứ tư, điều này có nghĩa rằng bit quan trọng nhất luôn được đặt cho chữ số hex đầu tiên của phần thứ tư. Điều này có nghĩa là số này rất không bao giờ có thể là 1, 2, 3 hoặc 5. Không tính GUID đã tạo, tất nhiên. Nhưng những người có MSB được đặt thành 0 xảy ra là phiên bản v1 hoặc v2. Và phần dấu thời gian của những thứ đó có nghĩa là chúng sẽ phải được tạo ra một số millenia trong tương lai để làm việc đó.

+3

Đây là điều đúng nhất. Ví dụ. nếu bạn đang sử dụng System.Guid nó là không thể vì 13 "nibble" sẽ luôn luôn là 4 và 17 sẽ luôn luôn là 8, 9, A, hoặc B – Nick

+1

Tuy nhiên, anh ta không chỉ yêu cầu cụ thể cho GUID "tất cả 1", anh ta chỉ dùng nó làm ví dụ. Có vẻ như anh ta có khả năng sử dụng một all-x guid để phân biệt các giá trị cụ thể khác nhau. Không phải là điều này thực sự làm cho lập luận này ít hợp lệ hơn. – Kevin

+1

@Kevin: Viết lại từ đầu. Giả sử GUID được tạo theo các đặc điểm kỹ thuật, điều này không thể xảy ra cho đến nay. – Joey

8

Về khả năng như bất kỳ cách nào được tạo ngẫu nhiên khác sẽ va chạm. Vì vậy, rất khó xảy ra.

Mặc dù, bạn có thể muốn suy nghĩ lại bằng cách sử dụng các hướng dẫn để "lưu trữ" dữ liệu như vậy. Chúng thực sự được sử dụng để xác định duy nhất các đối tượng và các thành phần.

+1

+1 cho "suy nghĩ lại bằng cách sử dụng guids", cân nhắc sử dụng enum thay vì –

+1

-1 để nói rằng các guids được tạo ngẫu nhiên có khả năng va chạm nhau - GUID được tạo sao cho không thể cho 2 GUID va chạm ngoại trừ trong trường hợp ngớ ngẩn như hai máy với cùng một địa chỉ MAC tạo GUID cùng một lúc. – Justin

+0

Kragen, tôi nghĩ bạn đã hiểu lầm quan điểm của tôi. Nó là bên cạnh không thể cho bất kỳ GUID ngẫu nhiên để được nhân đôi, vì vậy tôi đã chỉ ra rằng không có sự khác biệt trong xác suất (ngoài các trường hợp cụ thể được đề cập bởi Johannes) rằng hai GUIDs ngẫu nhiên tạo ra sẽ phù hợp và một guid ngẫu nhiên và 11111111-1111 -1111-1111-111111111111 sẽ khớp. – Kevin

3

Rất, rất thấp. Định dạng GUID bao gồm một vài bit xác định lược đồ. Nếu bạn muốn "tạo ra" cho mình, thì lược đồ GUID rất có thể sẽ sai.

-1

Giống như bất kỳ hướng dẫn nào khác.
Nếu bạn chèn nó vào cơ sở dữ liệu (ngay cả với một số ý nghĩa đặc biệt) thì bạn cũng có thể đảm bảo rằng nó là duy nhất với một ràng buộc thích hợp.

10

Khoảng 1 trong 5.316.911.983.139.663.491.615.228.241.121.400.000

Vì vậy, tôi nghĩ rằng bạn đang an toàn.

Nguồn: http://msdn.microsoft.com/en-us/library/aa446557.aspx

+36

"vì vậy bạn đang nói có cơ hội?" - Trích dẫn phim, không thể giúp bản thân mình – Martin

+2

Dumb and Dumber – Erix

+11

-1 - Nguồn phát biểu rằng có nhiều kết hợp GUID, nhưng GUID không chỉ là số ngẫu nhiên và do đó không giống với xác suất của GUID đã cho hiện có. – Justin

4

của GUID thường được tạo ra sử dụng một thuật toán, chứ không phải là một chuỗi thực sự ngẫu nhiên của các nhân vật hex. Nếu bạn có thể chắc chắn thuật toán nào đang được sử dụng để tạo chúng, bạn có thể chắc chắn nếu GUID bạn muốn sử dụng là "số ma thuật" sẽ va chạm với các số được tạo ra.

Wikipedia page on GUIDs có lượng thông tin phong phú về các thuật toán được sử dụng để có thể cung cấp cho bạn câu trả lời dứt khoát. Hoặc, chạy Reflector trên phương thức Guid.NewGuid() trong khung .net, mặc dù dựa trên việc xem reference source for the method, điều này gọi ra là CoCreateGuid in OLE32.

4

Tại sao sử dụng GUID được thiết kế đặc biệt? Bên cạnh khía cạnh dễ nhận biết, tại sao không chỉ sử dụng GUID được tạo đúng cách? (Bạn có biết nó sẽ là duy nhất, đó là điểm)

4

Câu hỏi của bạn đã được trả lời, nhưng tôi nghĩ tôi thực dụng ở đây.

1) Bạn sẽ chỉ cung cấp cho mình 8 tùy chọn "được mã hóa cứng" bằng quy ước này.

2) Bạn chỉ có thể tạo GUID thực cho từng trường hợp "đặc biệt" này thay vì xoay tay bằng tay. Bằng cách đó, nó được đảm bảo là duy nhất và bạn sẽ có thể có nhiều hơn 8.

Đó không phải là câu trả lời trực tiếp, nhưng đó có thể là một gợi ý hợp lý cho ý định của bạn.

2

Đối với công ty cuối cùng của mình, chúng tôi đã sử dụng các khóa làm khóa chính cho các bảng cho tất cả các cơ sở dữ liệu của chúng tôi. Trong tất cả chúng tôi đã tạo ra hơn 1.000.000.000 đối tượng và không bao giờ có bất kỳ vấn đề nào.