Có an toàn không khi cho rằng một GUID sẽ luôn là duy nhất?


123

Tôi biết có một chút khả năng xảy ra xung đột nhưng nếu tôi tạo một loạt 1000 GUID (ví dụ), liệu có an toàn nếu cho rằng tất cả chúng đều là duy nhất để lưu thử nghiệm từng cái không?

Câu hỏi thưởng

Một cách tối ưu để kiểm tra GUID về tính duy nhất? Bộ lọc Bloom có ​​thể?



29
Không nếu tất cả chúng ta giữ mashing nút tải lại trên trang web này: wasteaguid.info
mipadi

12
Tôi đổ lỗi cho tất cả các lỗi của mình do va chạm GUID. Nó phải xảy ra một thời gian phải không?
Michael

8
Nhiều khả năng một con cá mập với màu sắc kẻ sọc đáng yêu sẽ rơi từ trên trời xuống và đập nát máy tính của bạn thành từng mảnh, vì vậy, tôi đề nghị rằng việc đề phòng trước đó là phân bổ nguồn lực phù hợp hơn như một phần của việc giảm thiểu rủi ro tổng thể của bạn kế hoạch.
David Gladfelter

4
@mipadi: liên kết tuyệt vời! Tôi chỉ có thể hình dung một số nhà phát triển ở đâu đó đang than vãn "Guuuuys! Đừng lãng phí GUID! Tôi cần chúng!"
FrustratedWithFormsDesigner

Câu trả lời:


360

Có, bạn có thể. Vì GUID dài 128 bit, nên phải thừa nhận là có khả năng xảy ra xung đột trong phút chốc - nhưng từ "phút" không đủ mạnh. Có rất nhiều HƯỚNG DẪN mà nếu bạn tạo ra vài nghìn tỷ trong số chúng một cách ngẫu nhiên, bạn vẫn có nhiều khả năng bị thiên thạch đâm vào hơn là có một vụ va chạm (theo Wikipedia ). Và nếu bạn không tạo cho họ một cách ngẫu nhiên, nhưng ví dụ như sử dụng các thuật toán MAC-address-và thời gian đóng dấu, sau đó họ cũng đang đi tới là duy nhất, như địa chỉ MAC là duy nhất giữa các máy tính và tem thời gian là duy nhất trên của bạn máy vi tính.

Chỉnh sửa 1: Để trả lời câu hỏi thưởng của bạn, cách tối ưu để kiểm tra một tập hợp các HƯỚNG DẪN về tính duy nhất là chỉ cần giả sử rằng tất cả chúng đều là duy nhất. Tại sao? Bởi vì, với số lượng GUID mà bạn đang tạo, tỷ lệ xảy ra va chạm GUID nhỏ hơn tỷ lệ xảy ra tia vũ trụ lật một chút trong bộ nhớ máy tính của bạn và làm sai câu trả lời được đưa ra bởi bất kỳ thuật toán "chính xác" nào mà bạn quan tâm chạy. (Xem câu trả lời StackOverflow này cho bài toán.)

rất nhiều GUID ngoài đó. Để trích dẫn Hướng dẫn về Thiên hà cho Hitchhiker của Douglas Adams :

"Không gian", nó nói, "rất lớn. Thực sự rất lớn. Bạn sẽ không tin nó lớn đến mức khổng lồ đến mức nào. Ý tôi là bạn có thể nghĩ rằng đó là một chặng đường dài trên con đường đến với nhà hóa học, nhưng đó chỉ là hạt đậu phộng đến vũ trụ , nghe… "

Và vì có khoảng 7 × 10 22 ngôi sao trong vũ trụ và chỉ dưới 2 128 GUID, nên có khoảng 4,86 ​​× 10 15 — cao nhất là năm phần tư tỷ —GUID cho mỗi ngôi sao. Nếu mỗi ngôi sao đó đều có một thế giới với dân số thịnh vượng như của chúng ta, thì xung quanh mỗi ngôi sao, mọi người hoặc người ngoài hành tinh đã từng sống sẽ có quyền hưởng hơn bốn mươi lăm nghìn GUID. Đối với mọi người trong lịch sử tại mọi ngôi sao trong vũ trụ. Không gian GUID có cùng mức độ khổng lồ với kích thước của toàn bộ vũ trụ. Bạn không cần phải lo lắng.

( Chỉnh sửa 2: Suy ngẫm về điều này: wow. Tôi đã không nhận ra chính mình điều này có nghĩa là gì. Không gian GUID lớn đến mức khó hiểu. Tôi thực sự kinh ngạc về nó.)


1
Ngoài ra, WolframAlpha báo cáo rằng, đối với mỗi tế bào của mỗi người đã từng sống, có 36 nghìn tỷ UUID. Bạn có khoảng 10^14tế bào trong cơ thể và 106,5 tỷ người đã từng sống. Hoặc, 2.385 * 10^23UUID cho mỗi xu nợ công của Hoa Kỳ.
new123456

5
Mặc dù các con số vẫn còn cao, nhưng khả năng xảy ra va chạm GUID là hơn 50% ở 2 ^ 64 GUID.
NullUserException 22/10/12

1
Với 2 ^ 64 GUID, điều này sẽ cắt giảm các con số xuống dưới một (0,00026) cho mỗi ngôi sao trong Vũ trụ và 2 * 10 ^ (- 15) cho mỗi con người hoặc người ngoài hành tinh đã từng sống. Điều này vẫn sẽ cho phép cho hơn 170 triệu GUID cho mỗi con người ai đã từng sống, vì vậy tôi nghĩ rằng chúng tôi vẫn tốt.
NullUserException

12
Cần lưu ý rằng xung đột GUID cũng chỉ là một vấn đề nếu nó trong cùng một không gian kinh doanh. Một sử dụng GUID tôi để xác định một thành phần trong một phần mềm có thể được giống như một GUID bạn sử dụng trong một cơ sở dữ liệu hàng trong ứng dụng của riêng bạn mà không gây ra bất kỳ vấn đề
James Thorpe

1
Thực tế là có 2 ^ 128 GUIDS là không thích hợp, và bạn không phải là "vẫn tốt" ở mức 50% nguy cơ va chạm, bạn thậm chí không giỏi 0,0000001%
BlackTigerX

40

Câu trả lời ngắn gọn: cho các mục đích thực tế, có.

Tuy nhiên, bạn phải xem xét nghịch lý sinh nhật!

Tôi đã tính toán một vài xác suất va chạm đại diện. Với UUID 122-bit như được chỉ định trong bài viết trên Wikipedia , xác suất va chạm là 1/2 nếu bạn tạo ít nhất 2.71492e18UUID. Với 10 ^ 19 UUID, xác suất là 0,999918. Với 10 ^ 17 UUID, 0,000939953.

Một số con số để so sánh có thể được tìm thấy trên Wikipedia. Vì vậy, bạn có thể chỉ định một cách an toàn UUID cho từng con người đã sống, từng thiên hà trong vũ trụ quan sát được, từng loài cá trong đại dương và từng cá thể kiến ​​trên Trái đất. Tuy nhiên , các vụ va chạm gần như chắc chắn nếu bạn tạo ra UUID cho mỗi bóng bán dẫn mà nhân loại tạo ra trong một năm, từng côn trùng trên Trái đất, từng hạt cát trên Trái đất, từng ngôi sao trong vũ trụ quan sát được hoặc bất cứ thứ gì lớn hơn.

Nếu bạn tạo ra 1 tỷ UUID mỗi giây, sẽ mất khoảng 36 năm để xác suất va chạm là 10%.

Cuối cùng, có thể sẽ xảy ra xung đột giữa tập hợp các UUID được tạo ra trong quá trình lịch sử loài người. Tuy nhiên, xác suất mà các UUID bị va chạm sẽ được sử dụng cho cùng một mục đích là rất nhỏ, vì vậy không có vấn đề gì trong thực tế.


13
Đây là cách vũ trụ đầu ... Một số lập trình viên chỉ giả định GUID của họ sẽ luôn là duy nhất cho mega Death Star của họ ...
pkr298

Vì UUID dựa trên dữ liệu không ngẫu nhiên, nên 36 năm nữa - bạn chỉ phải lo lắng về từng mili giây riêng lẻ.
mjaggard

@mjaggard UUID dựa trên dữ liệu ngẫu nhiên. Dù sao thì bất kỳ loại hiện đại nào.
Trejkaz

8

Phân tích khả năng va chạm có trên Wikipedia: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

Như đã đề cập trong liên kết, điều này sẽ bị ảnh hưởng bởi các thuộc tính của trình tạo số ngẫu nhiên.

Cũng có khả năng xảy ra lỗi trong mã trình tạo GUID; trong khi cơ hội thấp, chúng có lẽ cao hơn khả năng va chạm dựa trên toán học.

Một bộ lọc Bloom có ​​thể thích hợp; nó có thể nhanh chóng cho bạn biết nếu GUID là duy nhất, nhưng có khả năng xảy ra dấu hiệu sai về va chạm. Một phương pháp thay thế nếu bạn đang kiểm tra hàng loạt tại một thời điểm là sắp xếp hàng loạt và so sánh từng phần tử kế tiếp.


5

Nói chung, có, nó là an toàn để giả định.

Nếu trình tạo GUID của bạn thực sự ngẫu nhiên, khả năng xảy ra xung đột trong vòng 1000 GUID là cực kỳ nhỏ.

Tất nhiên, điều đó giả định một trình tạo GUID tốt. Vì vậy, câu hỏi thực sự là về mức độ bạn tin tưởng vào công cụ bạn đang sử dụng để tạo GUID và nó có các bài kiểm tra riêng không?


0

Trong khi một vụ va chạm là có thể xảy ra, nhưng điều đó là rất khó xảy ra. (Toán học ở đây .) Có thể an toàn khi cho rằng chúng thực tế là khác biệt.


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.