2013-08-27 74 views
5

Tôi đã sử dụng điều này trong một thời gian dài, nhưng tôi không thể tìm thấy lời giải thích rõ ràng về khi nó không được đảm bảo duy nhất. Dưới đây là ý kiến ​​của tôi, xin vui lòng chính xác như bạn thấy phù hợp.Phương pháp nào để tạo GUID là tốt nhất để đảm bảo GUID thực sự là duy nhất?

Giá trị được đảm bảo là duy nhất (được tạo) trên máy được tạo. Vì vậy, GUID được tạo bởi ứng dụng .net trên máy sẽ không bao giờ xung đột với những ứng dụng được tạo bởi SQL Server trên cùng một máy.

Trong tất cả các trường hợp khác, không có sự đảm bảo nào. Về mặt lý thuyết, luôn luôn có thể nếu có nhiều nguồn tạo (nói các ứng dụng trên các máy tính khác nhau) cho trường định danh duy nhất trong một db trên một máy tính khác, có thể có các bản sao sẽ được chèn vào.

EDIT: Xin lỗi vì không tạo câu hỏi đúng cách. Tôi đoán tôi muốn biết xác suất của xung đột khi được tạo trên cùng một máy so với các máy khác nhau, nếu C# 's Guid.NewGuid(), các chức năng newid(), newsequentialid() của SQL Server hoặc bất kỳ chức năng nào khác bằng các ứng dụng khác nhau được sử dụng. Các 'đã được trả lời' liên kết có một trong những câu trả lời, nơi nó nói rằng ông thực sự gặp phải một trường hợp xảy ra. Làm cho bạn tự hỏi tần suất có thể xảy ra.

Nếu tôi có một bảng có trường uniqueidentifier là pk, tôi có phải lo lắng về việc kiểm tra tính duy nhất mỗi khi tôi chèn bằng cách tạo một giá trị mới bằng các ứng dụng khác nhau hoặc chức năng của SQL Server?

+5

Bạn nên đọc * Hướng dẫn GUID * chuỗi của Eric Lippert: http://blogs.msdn.com/b/ericlippert/archive/tags/guids/ – MarcinJuraszek

+0

Hoặc ít nhất RFC - http: //www.apps.ietf .org/rfc/rfc4122.html –

+1

Tôi chắc rằng bạn không hỏi về kiểu dữ liệu 'uniqueidentifier'. Bạn có thể hỏi về hàm newid', hoặc có lẽ là hàm 'newsequentialid'. Câu trả lời là hoàn toàn khác nhau cho hai chức năng này, và có lẽ cũng khác nếu bạn có ý nghĩa gì đó khác. – hvd

Trả lời

16

Tôi đoán tôi muốn biết khả năng xung đột khi tạo ra trên cùng một máy vs máy khác nhau, nếu, newid(), newsequentialid() chức năng SQL Server hay bất kỳ chức năng khác bằng cách ứng dụng khác nhau

Đó là C# 's Guid.NewGuid() một câu hỏi rộng lớn. "bất kỳ chức năng nào khác trong một ứng dụng khác" không phải là điều chúng ta có thể giải thích.

Thay vào đó, hãy đặt câu hỏi có thể trả lời và sau đó trả lời câu hỏi.

Các cơ chế khác nhau để tạo GUID là gì?

Phiên bản một GUID kết hợp địa chỉ MAC của máy hiện tại, thời gian hiện tại và một vài bit khác về nguồn gốc thực hiện cụ thể. Do đó, chúng độc đáo về thời gian và không gian.

Phiên bản ba và năm GUID sử dụng băm mã hóa sức mạnh của một chuỗi duy nhất. Xác suất va chạm của họ dựa trên xác suất của một va chạm băm.

Phiên bản bốn GUID sử dụng trình tạo số giả ngẫu nhiên. Xác suất va chạm của họ dựa trên xác suất của PRNG tạo ra xung đột.

Xác suất của một phiên bản GUID va chạm trên hai máy khác nhau, với giả định rằng máy có địa chỉ MAC duy nhất là gì?

0.

Xác suất của một phiên bản GUID va chạm khi chạy hai máy ảo trên cùng một máy vật lý và tạo GUID trên mỗi máy là gì?

Cao; nếu GUID được tạo ra trong cùng một lát thời gian thì chúng có khả năng va chạm cao.

Nếu đau khi bạn làm điều đó, đừng làm điều đó.

Phần còn lại của thuật toán GUID không phụ thuộc vào chi tiết của máy.

Xác suất của phiên bản ba hoặc năm GUID va chạm với nhau là gì, vì chuỗi nguồn là duy nhất?

Xác suất xấp xỉ giống với xác suất của phiên bản GUID bốn phiên bản, vì vậy hãy xem xét điều đó.

Xác suất của phiên bản GUID bốn phiên bản là gì?

Xác suất mà một v4 GUID nhất định sẽ va chạm với bất kỳ GUID v4 trong một bộ n GUIDs v4 duy nhất là n chia cho 2 .

Xác suất mà đưa ra một tập hợp các n v4 GUID sẽ chứa ít nhất một vụ va chạm là khó diễn tả nhưng nó là vô cùng nhỏ càng lâu càng n là đáng kể nhỏ hơn 2 .

+0

@OP: Mỗi Stephen Cleary ([Một vài từ trên GUID] (http://blog.stephencleary.com/2010/11/few-words-on-guids.html)), các trình tự tuần tự SQL không tuân thủ RFC. Stephen nói (trong phần "Các vấn đề cơ sở dữ liệu") rằng họ có khả năng tăng va chạm với các kết quả khác (RFC Compliant). – Brian

+1

Tôi dường như nhớ [một số người] (http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx) viết một loạt về GUID một lúc trở lại . :) – MgSam

+0

n²/2n¹²² phải là một xấp xỉ hợp lý cho "xác suất đưa ra một tập hợp các GUID n v4 sẽ chứa ít nhất một xung đột" khi n nhỏ hơn 2^61. – CodesInChaos