2011-12-27 32 views
24

thể trùng lặp:
Is a GUID unique 100% of the time?
Simple proof that GUID is not uniqueCơ hội nhận được một Guid.NewGuid() trùng lặp là gì?

Trong MSDN bạn có thể đọc:

The chance that the value of the new Guid will be all zeros or equal to any other Guid is very low.

Giả sử rằng bạn có một phương pháp mà sẽ tạo ra một tập tin mỗi thứ hai, và bạn sử dụng phương thức Guid.NewGuid() cho tên tệp, có thể nhận được cùng một hướng dẫn sau đó không? Hay máy tính cục bộ sẽ theo dõi theo cách nào đó? Làm thế nào thấp là cơ hội?

+13

Khoảng 1 trong 2^128. – tenfour

+0

Không, máy tính không theo dõi. Nhưng không, cơ hội của một GUID trùng lặp thấp đến mức không liên quan. Bạn đã trả lời câu hỏi của mình trong câu hỏi; tất cả các câu trả lời chỉ là vẹt mà lại cho bạn. –

+0

@CodyGray cụ thể cho bối cảnh của OP, hệ thống * không * theo dõi. Hệ thống tập tin sẽ theo dõi mọi GUID được sử dụng cho mục đích này và sẽ không cho phép bạn tạo một tệp có tên giống hệt nhau. Vì vậy, về cơ bản nếu OP viết mã tốt, câu trả lời là nó không quan trọng nếu có va chạm hay không. – tenfour

Trả lời

15

Bạn sẽ không bao giờ hết dung lượng. Khả năng sao chép chúng là rất thấp:

http://betterexplained.com/articles/the-quick-guide-to-guids/

+1

Tôi không đồng ý với điều này, vì nó không phải là rất thấp. Tôi có một ví dụ thực tế về nó, http://stackoverflow.com/questions/39771/is-a-guid-unique-100-of-the-time/21570510#21570510 – vikas

29

Cơ hội nhận được hai guids giống hệt nhau là thiên văn mỏng ngay cả khi bạn đang tạo ra guids nhanh nhất có thể. (Tạo ra, nói, hàng ngàn guids mỗi giây cho mục đích duy nhất là tìm kiếm một bản sao.)

Tất nhiên, nếu bạn muốn ý kiến ​​của tôi, tôi tin rằng sẽ có một thời gian, trong một vài nghìn năm từ bây giờ, khi chúng ta sẽ xâm chiếm thiên hà, dân số của chúng ta sẽ ở trong hàng nghìn tỷ, và số lượng máy tính cá nhân được nhúng ở mọi nơi sẽ được đếm trong các gazillions, khi chúng ta bắt đầu gặp rắc rối với các nhân đôi lặp lại mỗi lần trong một thời gian khu vực xa xôi của thiên hà, và sau đó nó sẽ giống như 640k bộ nhớ trên một lần nữa, DLL địa ngục tất cả hơn một lần nữa, hai con số năm millenium lỗi trên một lần nữa, tất cả chúng kết hợp. Điều với GUID là chúng ta không muốn chúng to lớn, bởi vì sau đó chúng sẽ lãng phí, vì vậy ai đó phải tìm ra một số bit đủ nhỏ để không lãng phí và lớn đến mức đủ để đảm bảo hợp lý chống lại va chạm. Vì vậy, nó là một sự thỏa hiệp công nghệ. Trong thế kỷ của chúng ta 128 bit dường như là một sự thỏa hiệp tốt, nhưng với sự chắc chắn gần như toán học sẽ có một thế kỷ khác khi sự thỏa hiệp này sẽ không còn tốt nữa.

+0

Bởi thời gian đó chúng ta sẽ có bộ vi xử lý lượng tử có khả năng hoạt động quan hệ và đa nhiệm thực sự và tôi không nghĩ rằng chúng ta sẽ quan tâm đến guids nữa. Chúng ta cũng sẽ có internet lượng tử sử dụng Entanglement Quantum để truyền tải dữ liệu và chúng ta sẽ có một vũ trụ trải rộng trên internet với độ trễ 10ms từ bất kỳ điểm nào đến điểm. Cũng khá có thể chúng tôi sẽ có ổ đĩa dọc (uốn cong không gian để có được FTL ..) –

+0

Tôi sợ rằng khả năng của chúng tôi để giao tiếp nhanh hơn sẽ chỉ làm cho va chạm GUID một hiện tượng thường xuyên hơn. –

+0

Hàng ngàn năm? Với mô hình hiện tại, có đủ GUID để phù hợp với ~ 800 triệu GUIDS mỗi nano giây trong 13,800 tỷ năm qua. Ngay cả khi chúng tôi nhận được quadrillions của máy tính mỗi tạo ra hàng tỷ GUIDs mỗi giây, nguy cơ sẽ không đáng kể trong một thời gian dài. Nếu có thực sự sẽ là một ngày mà nó có thể là một nguy cơ, chúng tôi sẽ có thiên niên kỷ để chuẩn bị cho một tiêu chuẩn mới với nói 4096 bit. –

1

Vui lòng đọc những câu dưới đây để biết về sự va chạm: Are GUID collisions possible?

Về cơ chế "một guid mỗi giây", tạo guids thường mất nhiều thời gian vào tài khoản, do đó trên cùng một máy tính, 0 cơ hội để tạo ra cùng một guid trừ bạn thay đổi cài đặt của đồng hồ nội bộ

chỉnh sửa chỉnh sửa về guids nói rằng thời gian không bắt buộc khi xây dựng một guid vì vậy tôi đoán nó phụ thuộc vào thuật toán được sử dụng. Vì chúng ta đang nói C# (trên cửa sổ?) Thực tế là một UUIDkhông bao gồm thời gian trong một số phiên bản.

0

Bạn chắc chắn sẽ hết dung lượng đĩa hoặc kẹt hệ thống tập tin trước khi GUID va chạm. Chỉ cần xử lý lỗi khi tạo tệp một cách duyên dáng và bạn sẽ ổn.

8

Luôn luôn có một số rất nhỏ cơ hội của bản sao, nhưng định danh duy nhất toàn cầu có nghĩa là để được chỉ rằng: toàn cầu độc đáo ... không toàn hệ thống duy nhất, nhưng như trong Planet Earth độc đáo.

Tôi suy đoán rằng, về mặt lý thuyết, bạn có cơ hội tốt hơn để sao chép UUID trên nhiều hệ thống, so với trên một hệ thống đơn lẻ. Trong khi hệ điều hành sẽ không lưu trữ mỗi GUID mà nó tạo ra, nó có thể sử dụng một số dữ liệu hạt giống dựa trên thời gian để tránh va chạm trong chính nó. Tất nhiên điều này phụ thuộc vào việc thực hiện.

Ồ, và rất có thể ... cũng có 3,4 x 10^38 có sẵn, Wikipedia cho biết bạn có nhiều khả năng bị ảnh hưởng bởi thiên thạch.

Tôi cũng sẽ cung cấp phương pháp thay thế, phương pháp Path.GetTempFileName() có thể đáng để xem xét, vì nó có khả năng chống va chạm ... mặc dù nó chỉ có thể tạo 65.535 tên tệp duy nhất trước khi ném ngoại lệ nếu các tệp trước đó ' t đã xóa.

Khác hơn thế, nó không phải rất khó khăn để làm:

string path; 

do 
{ 
    path = Guid.NewGuid().ToString(); // Format as needed 

} while (File.Exists(path)); 
+1

nó làm cho tôi cảm thấy tốt hơn rằng u đã đi từ nó chỉ là hệ thống rộng khắp hành tinh trái đất độc đáo !! tôi vẫn hoang tưởng về thực tế là nó không chắc chắn 100%.Tôi thà kiểm tra db để xem nó tồn tại nhưng tôi biết rằng nguyên nhân gây ra nhiều chi phí ... – ozzy432836

Các vấn đề liên quan