Có đáng để kiểm tra xem Guid.NewGuid () có phải là Guid.Empty không?


28

Trong một trong những dự án tôi đang thực hiện theo mô hình sau đây được nhìn thấy trên cơ sở khá thường xuyên:

var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
    guid = Guid.NewGuid().ToString();
}

Mặc dù tôi hiểu rằng aa GUID không được đảm bảo là duy nhất và theo tài liệu MSDN, GUID được tạo có thể bằng 0 , đây có phải là một sự cân nhắc thực tế đáng để gửi thử nghiệm chu kỳ cho cả về mặt tính toán và về mặt thời gian của nhà phát triển nghĩ về nó. ?


1
Nếu bạn đang thấy mô hình này lặp đi lặp lại có lẽ một phương pháp tiện ích sẽ theo thứ tự? Lặp đi lặp lại các đoạn mã như thế này có vẻ như là một vấn đề lớn hơn thực tế là bạn đang kiểm tra một trường hợp cạnh sẽ không bao giờ xảy ra và có thể không quan trọng ngay cả khi nó đã xảy ra.
psr

27
Mã đó là có để giữ cá sấu đi. Có cá sấu nơi bạn viết mã? Không? Sau đó, rõ ràng nó hoạt động!
Eric Lippert

3
Dù thế nào đi nữa, tôi sẽ làm điều này trong một thời gian.
Arturo Torres Sánchez

3
Tại sao bạn lại chuyển đổi các hướng dẫn thành chuỗi và sau đó so sánh? họ tự so sánh tốt
Andy

2
Các tài liệu đã được cập nhật: "Các Guid trở được đảm bảo để Guid.Empty không bằng."
sschoust

Câu trả lời:


33

Tôi sẽ đề nghị không đáng để kiểm tra Guid.Empty. Các tài liệu cho Guid.NewGuid vì một số lý do đề cập rằng

Cơ hội mà giá trị của Guid mới sẽ là tất cả các số không hoặc bằng với bất kỳ Guid nào khác là rất thấp.

Guid.NewGuid là một trình bao bọc cho Win32 API CoCreateGuid , không đề cập đến việc trả lại tất cả các số không.

Raymond Chen đi xa hơn , cho thấy rằng

không có triển khai CoCreateGuid hợp lệ nào có thể tạo GUID_NULL

Vì vậy, không, tôi sẽ không lo lắng về nó. Tôi sẽ không đoán được tại sao các tài liệu Guid.NewGuid thậm chí còn đề cập đến nó.


1
"Và ngay cả khi nó đã tạo GUID_NULL vì một số lý do, tính duy nhất sẽ yêu cầu nó làm như vậy chỉ một lần! (Vì vậy, bạn nên cố gắng buộc lỗi này xảy ra trong thử nghiệm, và sau đó bạn có thể tin tưởng rằng nó sẽ không bao giờ xảy ra trong sản xuất. )" - Tốt đẹp!
razethestray

3
@razethestray - Bạn có thể đặt cược tất cả những gì bạn muốn tại sòng bạc của tôi.
JeffO

10
@JeffO Đùa bạn, anh ấy chắc chắn quay 37 lần ở nhà và sẽ đặt tất cả tiền của mình vào người không đến.
Random832

Trên xamarin, Guid.NewGuid đôi khi không thành công và liên tục trả về sản phẩm nào (khi hướng dẫn được gán tự động trong lõi ef) không thể hiểu tại sao
Karan Harsh Wardhan

@KaranHarshWardhan Tôi hy vọng bạn báo cáo đó là một lỗi. :)
Curt Nichols

43

Nếu bạn thấy Guid.NewGuid() == Guid.Emptymình đã trúng xổ số khó nhất trên trái đất. Đừng bận tâm với bất kỳ sự độc đáo hoặc kiểm tra va chạm. Không phải làm điều đó là những gì hướng dẫn dành cho . Tôi sẽ dành cho bạn môn toán, nó ở khắp mọi nơi trên web.

Ngoài ra, các hướng dẫn Windows luôn có một "chữ số" bằng 4. Có một số cấu trúc để hướng dẫn.

Đoạn mã mà bạn đã đăng trông giống như một nhà phát triển đã quên khởi tạo một Guidbiến và tìm thấy nó Guid.Empty. Anh ta xác định nhầm Guid.NewGuid()là nguyên nhân. Bây giờ anh sẽ mãi mãi mê tín về điều này.

Trong mọi trường hợp đây là câu hỏi sai. Tôi chắc chắn rằng mã của bạn không chỉ phụ thuộc vào việc không bao giờ vẽ Guid.Emptymà còn phụ thuộc vào tính duy nhất. Đó là whilevòng lặp không thực thi độc đáo. Các hướng dẫn ở đó để tạo ra một giá trị duy nhất mà không cần phối hợp. Đó là trường hợp sử dụng của họ.


5
+1 thành "câu hỏi sai". Đó là tất cả về sự độc đáo, đó là tất cả những gì thực sự quan trọng.
Thomas Stringer

1
@rjzii xem xét làm cho câu trả lời này được chấp nhận!
emcor

18

Nhìn vào mã nguồn của Guid.NewGuidphương thức :

public static Guid NewGuid() {
    Contract.Ensures(Contract.Result<Guid>() != Guid.Empty);
    ...
}

Xem hợp đồng mã? Các Guid.NewGuidphương pháp không bao giờ đưa ra một GUID trống.


2
Không chắc chắn lý do tại sao bạn nhận được một downvote, vì nó đề cập đến một cái gì đó còn thiếu trong các câu trả lời khác. Sự hiện diện của hợp đồng mã là một đảm bảo khá tốt, và cũng đưa ra một câu trả lời tuyệt vời cho câu hỏi ban đầu. +1 cho ý tưởng nhìn vào thực hiện thực tế.
Arseni Mourzenko

Tôi yêu hợp đồng mã.
Andy

10

Nếu bạn định kiểm tra GUID với GUID bằng 0, thì theo logic tương tự, bạn cũng cần phải thực hiện kiểm tra đối với tất cả các GUID khác trong ứng dụng của bạn (vì xác suất nhận được số 0 phải giống như xác suất của nhận bất kỳ GUID nào khác trong ứng dụng của bạn *). Bạn cần phải làm điều này để chứng minh tiên đề mà bạn đang thực hiện là GUID này sẽ là duy nhất (thực tế là cùng một tiên đề như thử nghiệm so với 0).

Rõ ràng làm điều này là vô lý.

TLDR; Nếu bạn có thể tin tưởng NewGuid () để tạo ra kết quả duy nhất, bạn cũng có thể tin tưởng nó để không tạo ra bất kỳ GUID nào được biết đến.

* Thực tế không giống như xác suất .NET GUID luôn phù hợp với những điều sau đây {________-____-4___-____-____________}vì vậy NewGuid sẽ KHÔNG BAO GIỜ tạo ra một hướng dẫn bằng không

Để giải trí, tôi đã đề xuất một cải tiến cho các tài liệu ở đây: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid


3
Tại sao .NET GUID luôn bao gồm số 4?
Arturo Torres Sánchez

9
@ ArturoTorresSánchez: Để biết câu trả lời cho câu hỏi của bạn và nhiều sự thật thú vị khác về GUID, hãy xem loạt bài viết của tôi bắt đầu từ đây. ericlippert.com/2012/04/24/guid-guide-part-one Tôi lưu ý rằng Luke đã liên kết với phần ba để thuận tiện cho bạn. Câu trả lời ngắn: GUID phiên bản 4 luôn bao gồm 4.
Eric Lippert

@EricLippert đó là một bài viết rất hay :)
Không được yêu Không phải người của họ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.