Là một GUID duy nhất 100% thời gian?


519

Là một GUID duy nhất 100% thời gian?

Nó sẽ duy nhất trên nhiều chủ đề?


264
Không, không phải 100% ... Chỉ cần 99,999999999999999999999999999999999999999999999999999999999999999999999999999%;)
JohannesH

52
Trước hết, GUID không phải là vô hạn, điều đó có nghĩa là theo nghĩa đen của "100% thời gian", có nghĩa là cho dù bạn có tiếp tục tạo GUID bao lâu thì chúng vẫn luôn là duy nhất. Đây không phải là trường hợp. Ngoài ra, kể từ khi triển khai ban đầu, trong đó serial / id / MAC duy nhất của card mạng đã được sử dụng để tạo ra một phần của khóa không còn được sử dụng, vì nhiều lý do, GUID không thực sự là duy nhất trên toàn cầu nữa. Đó là, tuy nhiên, duy nhất địa phương . Nói cách khác, nếu bạn tiếp tục tạo GUID trên một máy, bạn sẽ không nhận được các bản sao.
Lasse V. Karlsen

36
@ojrac Tôi chỉ chọn làm tròn xuống ...: P
JohannesH

403
Mỗi lần tôi tạo GUID, tôi cảm thấy như mình đang đánh cắp một thứ từ Vũ trụ. Đôi khi tôi nghĩ về những người độc ác tạo ra nhiều GUID hơn họ cần và những GUID bị lãng phí đó rất cô đơn không được sử dụng hoặc tạo lại ...
asavartsov

29
@asavartsov Tôi nghĩ bạn sẽ thích Wasteeaguid.info ^ _ ^
Navin

Câu trả lời:


431

Mặc dù mỗi GUID được tạo không được đảm bảo là duy nhất, nhưng tổng số khóa duy nhất (2 128 hoặc 3,4 × 10 38 ) lớn đến mức xác suất của cùng một số được tạo hai lần là rất nhỏ. Ví dụ, hãy xem xét vũ trụ quan sát được, chứa khoảng 5 × 10 22 sao; mỗi ngôi sao sau đó có thể có 6,8 × 10 15 GUID duy nhất trên toàn cầu.

Từ Wikipedia .


Đây là một số bài viết hay về cách tạo GUID (cho .NET) và cách bạn có thể nhận được hướng dẫn tương tự trong tình huống phù hợp.

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part-three/

Hay nói, là một tài tài của, qua, qua, qua một tài khác, qua giữ, qua một tài khác


115
Họ sẽ không được gọi là UUID chứ? ;)
Arafangion

28
GUID là triển khai cụ thể của microsoft về tiêu chuẩn UUID. Vì vậy, đó là cả hai. ID duy nhất toàn cầu so với ID duy nhất toàn cầu.
Adam Davis

40
Về mặt kỹ thuật, nó không phải là 2 ^ 128, vì trong GUID v4, bạn có một chữ số hex sẽ luôn là 4 (loại bỏ 4 bit một cách hiệu quả) và hai bit nữa cũng được bảo lưu. Tuy nhiên, 2 ^ 122 VID GUID hợp lệ vẫn còn khoảng 5x10 ^ 36, điều này sẽ giúp tôi. và cho bạn quá. Mỗi ngôi sao sẽ phải chấp nhận chỉ khoảng 1,1x10 ^ 14 người xin lỗi.
Andrew Shelansky

67
Nếu bạn giống tôi, thì bạn sẽ muốn biết rằng 2^128viết ra là xấp xỉ : 34,028,236,692,093,846,346,337,460,743,177,000,000. Theo thống kê, nếu bạn tính 1000 GUID mỗi giây, sẽ vẫn mất hàng nghìn tỷ năm để có được một bản sao.
Thực thể

26
Tôi chỉ nghĩ nó thật buồn cười khi đọc nó ra nên ở đây có những người vui vẻ :) Ba mươi bốn không hai mươi tám tỷ hai trăm ba mươi sáu tỷ sáu trăm chín mươi hai mươi chín mươi ba trăm tám trăm sáu mươi sáu trăm ba mươi sáu triệu bốn trăm sáu mươi nghìn tỷ bảy trăm bốn mươi ba tỷ một trăm bảy mươi bảy triệu
hjavaher

85

Nếu bạn sợ các giá trị GUID giống nhau thì hãy đặt hai trong số chúng cạnh nhau.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

Nếu bạn quá hoang tưởng thì hãy đặt ba.


64
Bạn phải rất, rất, rất, rất hoang tưởng để nối 3 GUID.
harsimranb

25
@harsimranb Không ... rất, rất, rất, rất hoang tưởng là 6 HƯỚNG DẪN. Paranoid là một phụ lục, rất hoang tưởng là hai phụ, v.v.
Suamere

37
@Suamere Tôi đã tạo một trang web để tính toán mức độ hoang tưởng của bạn là walkge.github.io/HowParanoidAmI
Chạy bộ

3
@Jogge xD Thật tuyệt vời, lol. Sau 9 giờ 999999999ở dạng của bạn, tôi nghĩ Paranoia sẽ làm hỏng Trình duyệt của tôi.
Suamere

66

Câu trả lời đơn giản là đồng ý.

Raymond Chen đã viết một bài viết tuyệt vời về GUID và tại sao các chuỗi con của GUID không được đảm bảo duy nhất. Bài viết đi sâu vào một số cách mà GUID được tạo ra và dữ liệu họ sử dụng để đảm bảo tính duy nhất, sẽ đi vào một số độ dài để giải thích lý do tại sao :-)


23
Tôi nghĩ rằng bài viết của Chen đang đề cập đến V1 của thuật toán tạo GUID, sử dụng địa chỉ MAC & dấu thời gian - V4 hiện tại sử dụng số giả ngẫu nhiên thay vào đó: en.wikipedia.org/wiki/Globally_Unique_Identifier#Alacticm
Barrett

2
liên kết đã chết - 403 Bị cấm
daya


39

Như một lưu ý phụ, tôi đã chơi xung quanh với Volume GUID trong Windows XP. Đây là một bố cục phân vùng rất tối nghĩa với ba đĩa và mười bốn tập.

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

Không phải các GUID rất giống nhau mà thực tế là tất cả các GUID đều có chuỗi "mario" trong đó. Đó có phải là sự trùng hợp ngẫu nhiên hay có một lời giải thích đằng sau điều này?

Bây giờ, khi googling cho phần 4 trong GUID, tôi đã tìm thấy khoảng 125.000 lượt truy cập với âm lượng GUID.

Kết luận: Khi nói đến Volume GUID, chúng không độc đáo như các GUID khác.


31
Hãy nhớ rằng quảng cáo Super Mario Bros 3 từ những năm 80? Tất cả những người đó hét lên "Mario! Mario! Mario!" trên khắp thế giới làm đảo lộn sự ngẫu nhiên của vũ trụ một chút.
MGOwen

24
Nếu bạn tự cài đặt Office 2010 theo cách thủ công msiexec, nó sẽ liệt kê tất cả MSI GUID của chương trình văn phòng. Tất cả đều đánh vần 0FF1CE. Có vẻ như Microsoft có một cách giải thích khá ... lỏng lẻo về cách tạo GUID;)
Mark Henderson

3
Các GUID phân vùng này đều được tạo cùng nhau vào 2009-12-17 @ 2:47:45 PM UTC. Chúng là duy nhất cho máy của bạn, nhưng đặt "mario" làm định danh nút là không chính xác - điều đó có nghĩa là chúng không tuân thủ RFC-4122. Tương tự, các 0FF1CEGUID nằm trong phần "Tương thích ngược NCS" của RFC-4122, nhưng không chắc là Microsoft đang tuân theo các quy tắc NCS cho các giá trị đó.
Stephen Cleary

16
Tôi biết điều đó, Cục Quản lý An ninh Nintendo đã thỏa hiệp các trình tạo số ngẫu nhiên.
MetaGuru

1
có lẽ đây là công viên bóng giống như tên của công ty sản xuất nước khoáng (nghe nói họ dẫn đầu thị trường) Evian. Đánh vần ngược cho Naive :-)
Mariusz

31

Nó không nên xảy ra. Tuy nhiên, khi .NET chịu tải nặng, có thể nhận được các hướng dẫn trùng lặp. Tôi có hai máy chủ web khác nhau sử dụng hai máy chủ sql khác nhau. Tôi đã đi để hợp nhất dữ liệu và thấy tôi có 15 triệu hướng dẫn và 7 bản sao.


1
Làm thế nào là điều này có thể trên hai máy khác nhau? Tôi nghĩ một phần của GUID là tên máy? (không tranh cãi ... chỉ cần hỏi)
John Cruz

8
Điều này chỉ đúng với các hướng dẫn v1 sử dụng địa chỉ MAC (không phải tên máy) như một phần của thế hệ GUID. V4, là STD trên thực tế không còn sử dụng địa chỉ Mac mà là số ngẫu nhiên giả.
Xander

14
Guid.NewGuidluôn tạo GUID v4 (và luôn luôn có). Tim phải có nguồn entropy cực kỳ nghèo nàn.
Stephen Cleary

1
Điều đó đã bao giờ được nhân rộng? đó là một vấn đề lớn nếu nó là trường hợp.
Zyo

1
Tương tự ở đây trong khi Nhập dữ liệu rất lớn. Từ khoảng 10 đến 100 triệu, bạn nhận được các bản sao từ Guid.NewGuid
Stephan Baltzer

28

Có, một GUID phải luôn là duy nhất. Nó dựa trên cả phần cứng và thời gian, cộng thêm một vài bit để đảm bảo nó là duy nhất. Tôi chắc chắn về mặt lý thuyết là có thể kết thúc với hai cái giống hệt nhau, nhưng cực kỳ khó xảy ra trong một kịch bản trong thế giới thực.

Đây là một bài viết tuyệt vời của Raymond Chen trên Guids:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx


5
Bài viết này khá cũ và đề cập đến v1 của GUID. v4 không sử dụng phần cứng / thời gian mà thay vào đó là thuật toán số ngẫu nhiên. vi.wikipedia.org/wiki/Globally_unique_identifier#Alacticm
Mani Gandham

Liên kết này bị hỏng
Marcel


23

Hướng dẫn là thống kê độc đáo. Tỷ lệ cược của hai khách hàng khác nhau tạo ra cùng một Hướng dẫn là cực kỳ nhỏ (giả sử không có lỗi trong mã tạo Hướng dẫn). Bạn cũng có thể lo lắng về bộ vi xử lý của mình bị trục trặc do tia vũ trụ và quyết định rằng 2 + 2 = 5 ngày hôm nay.

Nhiều luồng phân bổ các hướng dẫn mới sẽ nhận được các giá trị duy nhất, nhưng bạn sẽ nhận được rằng hàm bạn đang gọi là luồng an toàn. Môi trường này ở trong môi trường nào?


19

Eric Lippert đã viết một loạt bài viết rất thú vị về GUID.

Trên thế giới có khoảng 2 30 máy tính cá nhân (và tất nhiên có rất nhiều thiết bị cầm tay hoặc thiết bị máy tính không có PC có cùng mức độ sức mạnh tính toán, nhưng hãy bỏ qua những thiết bị đó). Giả sử rằng chúng ta đặt tất cả các PC đó trên thế giới vào nhiệm vụ tạo GUID; nếu mỗi người có thể tạo ra, giả sử, 2 20 GUID mỗi giây thì chỉ sau khoảng 2 72 giây - một trăm năm mươi nghìn tỷ năm - bạn sẽ có cơ hội rất cao để tạo ra xung đột với GUID cụ thể của mình. Và tỷ lệ va chạm trở nên khá tốt chỉ sau ba mươi nghìn tỷ năm.


28
... và anh ấy tiếp tục trong đoạn tiếp theo: "Nhưng đó là tìm kiếm sự va chạm với một GUID cụ thể. [...] Vì vậy, nếu chúng tôi đưa hàng tỷ PC đó hoạt động để tạo ra GUID 122 bit ngẫu nhiên, xác suất đó là hai trong số chúng ở đâu đó sẽ va chạm rất cao sau khoảng 2 ^ 61 GUID được tạo ra. Vì chúng tôi giả định rằng khoảng 2 ^ 30 máy đang thực hiện 2 ^ 20 GUID mỗi giây, chúng tôi sẽ mong đợi một vụ va chạm sau khoảng 2 ^ 11 giây, tức là khoảng một giờ . " (Và cuối cùng anh ấy giải thích rằng, tất nhiên, không có nhiều GUID được tạo ra.)
Arjan

16

Về mặt lý thuyết, không, chúng không phải là duy nhất. Có thể tạo ra một hướng dẫn giống hệt nhau nhiều lần. Tuy nhiên, khả năng nó xảy ra rất thấp đến mức bạn có thể cho rằng chúng là duy nhất.

Tôi đã đọc trước rằng cơ hội rất thấp đến mức bạn thực sự nên nhấn mạnh về điều gì khác - như máy chủ của bạn tự bốc cháy hoặc các lỗi khác trong mã của bạn. Đó là, giả sử nó là duy nhất và không xây dựng bất kỳ mã nào để "bắt" các bản sao - dành thời gian của bạn cho một cái gì đó có nhiều khả năng xảy ra (nghĩa là bất cứ điều gì khác).

Tôi đã cố gắng mô tả sự hữu ích của GUID cho khán giả blog của tôi (những người ghi nhớ gia đình không có kỹ thuật). Từ đó (thông qua Wikipedia), tỷ lệ tạo GUID trùng lặp:

  • 1 trong 2 ^ 128
  • 1 trong 340 tỷ đồng (đừng lo lắng, không có tỷ lệ không có trong bài kiểm tra)
  • 1 trong 3,4 × 10 ^ 38
  • 1 trong 340.000.000.000.000.000.000.000.000.000.000.000.000

1
Trên thực tế, tôi không đồng ý về việc 'không lo lắng về điều đó', mặc dù từ một lập trường khác: nếu bạn phát hiện ra một vụ va chạm GUID, thì đã xảy ra sự cố với ứng dụng của bạn. Ví dụ, tôi đã sử dụng GUID cho tính không ổn định và đã bị xung đột khi một lệnh được gửi hai lần (với cùng một GUID).
Kenny Hung

9

Dường như không đề cập đến toán học thực tế về xác suất xảy ra.

Đầu tiên, giả sử chúng ta có thể sử dụng toàn bộ không gian 128 bit (Guid v4 chỉ sử dụng 122 bit).

Chúng tôi biết rằng xác suất chung của việc KHÔNG nhận được một bản sao trong các lượt nchọn là:

(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )

Vì 2 128 lớn hơn nhiều n, chúng ta có thể ước chừng điều này là:

(1-1 / 2 128 ) n (n-1) / 2

Và bởi vì chúng ta có thể giả sử nlà lớn hơn nhiều so với 0, nên chúng ta có thể ước chừng rằng:

(1-1 / 2 128 ) n ^ 2/2

Bây giờ chúng ta có thể đánh đồng điều này với xác suất "chấp nhận được", giả sử 1%:

(1-1 / 2 128 ) n ^ 2/2 = 0,01

Mà chúng tôi giải quyết nvà nhận được:

n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))

Mà Wolfram Alpha được 5,598318 × 10 19

Để đưa con số đó vào viễn cảnh, hãy lấy 10000 máy, mỗi máy có CPU 4 nhân, thực hiện 4Ghz và dành 10000 chu kỳ để tạo Hướng dẫn và không làm gì khác. Sau đó sẽ mất ~ 111 năm trước khi chúng tạo ra một bản sao.


Tôi đã chỉnh sửa bài đăng của bạn sau bài đăng này - vui lòng chỉnh sửa nếu tôi làm sai;).
shA.t

Xin chào @Cine, tôi có quyền chỉnh sửa phản hồi của bạn nhưng đã chọn không tham gia vì tôi muốn có cơ hội để bạn từ chối nó trước, có lẽ tôi sẽ đến trong một tháng để thay đổi chính thức nếu tôi không ' t nghe từ bạn Tôi khá chắc chắn rằng toán học của bạn là sai mặc dù. phương trình thực để xác định cơ hội 1% là đây: ((2 ^ 128 - 1) / 2 ^ 128) ^ ((n (n-1)) / 2) = .01. Số mũ của bạn là sai. nó không chỉ là n. Bạn cần C (n, 2) (aka (n * (n-1)) / 2) để tính toán tất cả các kết hợp khi bạn tạo các hướng dẫn "n". Xem tại đây để biết thêm thông tin
viggity

Cảm ơn Cine, tôi cũng đã kết thúc xấp xỉ n ^ 2/2 vì nó rất lớn :)
viggity

Sẽ mất 10000 máy 111 năm để tạo ra mỗi GUID có thể, và sau đó tạo một bản sao. Tuy nhiên, một bản sao sẽ xảy ra rất lâu trước khi tất cả các GUID có thể được tạo. Tôi nghĩ khung thời gian gần đúng sẽ phụ thuộc vào mức độ 'ngẫu nhiên' của quá trình tạo GUID.
George K

@GeorgeK Tôi nghĩ bạn đã hiểu nhầm ... Phải mất 10000 máy 111 năm để có 1% cơ hội gặp phải một bản sao. Nhưng vâng, toán học toán học này giả định rằng trình tạo ngẫu nhiên là hoàn toàn ngẫu nhiên.
Cine

7

Từ http://www.guidgenerator.com/online-guid-generator.aspx

HƯỚNG DẪN là gì?

GUID (hoặc UUID) là từ viết tắt của 'Định danh duy nhất toàn cầu' (hoặc 'Định danh duy nhất toàn cầu'). Nó là số nguyên 128 bit được sử dụng để xác định tài nguyên. Thuật ngữ GUID thường được sử dụng bởi các nhà phát triển làm việc với các công nghệ của Microsoft, trong khi UUID được sử dụng ở mọi nơi khác.

GUID độc đáo như thế nào?

128 bit là đủ lớn và thuật toán tạo đủ độc đáo để nếu 1.000.000.000 GUID mỗi giây được tạo trong 1 năm, xác suất trùng lặp sẽ chỉ là 50%. Hoặc nếu mỗi người trên Trái đất tạo ra 600.000.000 GUID thì sẽ chỉ có xác suất 50% trùng lặp.


7
50% cơ hội của một bản sao đủ cao để gây sợ hãi?
đĩa vào

1
@disklosr yeah đủ để gây sợ hãi nếu hệ thống của bạn tạo ra 1 tỷ GUID mỗi giây. Trong trường hợp cực kỳ khó xảy ra, bạn sẽ tạo ra số tiền đó, sau đó chỉ cần xâu chuỗi hai GUID lại với nhau ...
maxshuty

5

Tôi đã trải nghiệm một GUID trùng lặp.

Tôi sử dụng máy quét để bàn Neat Receipts và nó đi kèm với phần mềm cơ sở dữ liệu độc quyền. Phần mềm có tính năng đồng bộ hóa với đám mây và tôi liên tục gặp lỗi khi đồng bộ hóa. Một người thích đọc nhật ký tiết lộ dòng tuyệt vời:

"lỗi": [{"mã": 1, "tin nhắn": "creator_guid: đã được sử dụng", "guide": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

Tôi đã có một chút hoài nghi, nhưng chắc chắn, khi tôi tìm được đường vào cơ sở dữ liệu gọn gàng cục bộ của mình và xóa bản ghi chứa GUID đó, lỗi đã dừng xảy ra.

Vì vậy, để trả lời câu hỏi của bạn với bằng chứng giai thoại, không. Một bản sao là có thể. Nhưng có khả năng lý do nó xảy ra không phải do tình cờ, mà do thực tiễn tiêu chuẩn không được tuân thủ theo một cách nào đó. (Tôi không may mắn như vậy) Tuy nhiên, tôi không thể nói chắc chắn. Nó không phải là phần mềm của tôi.

Bộ phận hỗ trợ khách hàng của họ rất lịch sự và hữu ích, nhưng họ chưa bao giờ gặp phải vấn đề này trước đây vì sau hơn 3 giờ trên điện thoại với họ, họ đã không tìm thấy giải pháp. (FWIW, tôi rất ấn tượng với Neat, và sự cố này, tuy bực bội, đã không thay đổi quan điểm của tôi về sản phẩm của họ.)


19
Đừng tin rằng bạn có một bản sao. Có thể có một cái gì đó khác liên quan, như số không thực sự ngẫu nhiên hoặc có vấn đề trong quá trình đồng bộ hóa, hoặc hệ thống đã cố gắng ghi lại hai lần, v.v. Một vấn đề phần mềm có nhiều khả năng hơn là bạn bị GUID trùng lặp.
orad

4

MSDN :

Có một xác suất rất thấp rằng giá trị của Hướng dẫn mới là tất cả các số 0 hoặc bằng với bất kỳ Hướng dẫn nào khác.


4

Nếu đồng hồ hệ thống của bạn được đặt đúng cách và không được bọc xung quanh và nếu NIC của bạn có MAC riêng (nghĩa là bạn chưa đặt MAC tùy chỉnh) và nhà cung cấp NIC của bạn đã không tái chế MAC (mà họ không phải làm nhưng điều này đã được biết là xảy ra) và nếu chức năng tạo GUID của hệ thống của bạn được triển khai đúng cách, thì hệ thống của bạn sẽ không bao giờ tạo GUID trùng lặp.

Nếu mọi người trên trái đất đang tạo GUID tuân theo các quy tắc đó thì GUID của bạn sẽ là duy nhất trên toàn cầu.

Trong thực tế, số người phá vỡ các quy tắc là thấp và GUID của họ không có khả năng "thoát". Xung đột là không thể thống kê.


11
Điều này chỉ đúng với các hướng dẫn v1. V4, là STD trên thực tế không còn sử dụng địa chỉ Mac mà là số ngẫu nhiên giả.
Pita.O

1
"Sau đó, hệ thống của bạn sẽ không bao giờ tạo GUID trùng lặp" Ngay cả khi tất cả các quy tắc được tuân theo hướng dẫn v1 như bạn nói, hệ thống của bạn vẫn có thể tạo các bản sao. Bạn đúng hơn ở phía dưới khi bạn nói "Xung đột là không thể thống kê được."
Nick Meldrum

3

Là một GUID duy nhất 100% thời gian?

Không được bảo đảm, vì có một số cách tạo một. Tuy nhiên, bạn có thể thử tính toán cơ hội tạo hai GUID giống hệt nhau và bạn có ý tưởng: một GUID có 128 bit, do đó, có 2 128 GUID riêng biệt - nhiều hơn nhiều so với các ngôi sao trong vũ trụ đã biết. Đọc bài viết trên wikipedia để biết thêm chi tiết.


2

Nói một cách khái quát hơn, điều này được gọi là "vấn đề sinh nhật" hay "nghịch lý sinh nhật". Wikipedia có một tổng quan khá tốt tại: Wikipedia - Vấn đề sinh nhật

Nói một cách rất sơ sài, căn bậc hai của kích thước của pool là một xấp xỉ thô khi bạn có thể mong đợi 50% cơ hội trùng lặp. Bài viết bao gồm một bảng xác suất kích thước nhóm và các xác suất khác nhau, bao gồm một hàng cho 2 ^ 128. Vì vậy, với xác suất va chạm 1%, bạn sẽ mong đợi chọn ngẫu nhiên 2,6 * 10 ^ 18 số 128 bit. Cơ hội 50% yêu cầu 2,2 * 10 ^ 19 lượt chọn, trong khi SQRT (2 ^ 128) là 1,8 * 10 ^ 19.

Tất nhiên, đó chỉ là trường hợp lý tưởng của một quá trình thực sự ngẫu nhiên. Như những người khác đã đề cập, rất nhiều thứ đang cưỡi trên khía cạnh ngẫu nhiên đó - máy phát điện và hạt giống tốt như thế nào? Sẽ thật tuyệt nếu có một số hỗ trợ phần cứng để hỗ trợ quá trình này sẽ chống đạn nhiều hơn ngoại trừ mọi thứ có thể bị giả mạo hoặc ảo hóa. Tôi nghi ngờ đó có thể là lý do tại sao địa chỉ MAC / tem thời gian không còn được kết hợp.


Tôi nghĩ vấn đề MAC là ẩn danh. Tôi tin rằng việc sử dụng một mã định danh như địa chỉ MAC theo cách có thể đảo ngược là mối quan tâm riêng tư. Tôi tin rằng ngẫu nhiên thực sự trong phần cứng là rất khó? Cloudflare sử dụng máy ảnh và một dãy đèn dung nham, tuy nhiên tôi nghĩ rằng với sự hiểu biết chính xác về vật lý, thậm chí điều đó không phải là ngẫu nhiên? Đèn dung nham của Cloudflares RNG: popularmechanics.com/t Technology / security / news / a28921 / từ
Jeff Block

2

Để có kết quả tốt hơn, cách tốt nhất là nối thêm GUID với dấu thời gian (Chỉ để đảm bảo rằng nó vẫn duy nhất)

Guid.NewGuid().ToString() + DateTime.Now.ToString();

Điều gì nếu bạn nhận được hai va chạm trong cùng một giây?
Wai Ha Lee

Đó là trường hợp xấu nhất nhưng vẫn vậy, chúng ta không thể có cùng hai Guid được tạo ra cùng một lúc.
Adithya Sai

Ở đâu đó họ tranh luận, rằng người ta nên sao chép từ câu trả lời trên SO, không phải câu hỏi, nhưng tôi không chắc lắm bây giờ ....
Marcel

Làm thế nào về Guid.NewGuid (). ToString (). Thay thế ("-", "") + DateTime.Now.Ticks .... Không nghi ngờ về tính duy nhất và có thể được sử dụng làm khóa chính
d-coder

1

Các thuật toán GUID thường được triển khai theo đặc tả GUID v4, về cơ bản là một chuỗi giả ngẫu nhiên. Đáng buồn thay, những thứ này rơi vào loại "có thể không phải là duy nhất" , từ Wikipedia (Tôi không biết tại sao rất nhiều người bỏ qua bit này): "... các phiên bản GUID khác có các tính chất và xác suất duy nhất khác nhau, từ tính duy nhất được bảo đảm có khả năng không phải là duy nhất. "

Các thuộc tính giả ngẫu nhiên của JavaScript của V8 Math.random()là TERRIBLE ở tính duy nhất, với các va chạm thường xuất hiện chỉ sau vài nghìn lần lặp, nhưng V8 không phải là thủ phạm duy nhất. Tôi đã thấy các xung đột GUID trong thế giới thực bằng cách sử dụng cả các triển khai v4 GUID của PHP và Ruby.

Bởi vì nó ngày càng trở nên phổ biến hơn để tạo quy mô ID trên nhiều máy khách và cụm máy chủ, entropy gây ảnh hưởng lớn - cơ hội của cùng một hạt giống ngẫu nhiên được sử dụng để tạo ra một thang leo ID (thời gian thường được sử dụng như một hạt giống ngẫu nhiên trong các máy phát giả ngẫu nhiên) và các va chạm GUID leo thang từ "có thể không phải là duy nhất" đến "rất có thể gây ra nhiều rắc rối".

Để giải quyết vấn đề này, tôi bắt đầu tạo ra một thuật toán ID có thể mở rộng quy mô một cách an toàn và đảm bảo chống va chạm tốt hơn. Nó làm như vậy bằng cách sử dụng dấu thời gian, bộ đếm máy khách trong bộ nhớ, dấu vân tay của máy khách và các ký tự ngẫu nhiên. Sự kết hợp của các yếu tố tạo ra một sự phức tạp phụ gia có khả năng chống va chạm đặc biệt, ngay cả khi bạn mở rộng nó trên một số máy chủ:

http://usecuid.org/


1

Tôi đã trải nghiệm các GUID không phải là duy nhất trong quá trình kiểm tra đơn vị đa luồng / đa quy trình (quá?). Tôi đoán điều đó có liên quan, tất cả các giai điệu khác đều bằng nhau, việc gieo hạt giống (hoặc thiếu hạt giống) của các trình tạo ngẫu nhiên giả. Tôi đã sử dụng nó để tạo tên tập tin duy nhất. Tôi thấy hệ điều hành tốt hơn nhiều khi làm điều đó :)

Cảnh báo troll

Bạn hỏi nếu GUID là duy nhất 100%. Điều đó phụ thuộc vào số lượng GUID mà nó phải là duy nhất trong số đó. Khi số lượng GUID tiếp cận vô hạn, xác suất cho các GUID trùng lặp tiếp cận 100%.


1

Câu trả lời của "GUID có độc đáo 100% không?" chỉ đơn giản là "Không" .

  • Nếu bạn muốn 100% tính duy nhất của GUID thì hãy làm theo.

    1. tạo GUID
    2. kiểm tra xem GUID đó có tồn tại trong cột bảng của bạn không, nơi bạn đang tìm kiếm sự độc đáo
    3. nếu tồn tại thì goto bước 1 khác bước 4
    4. sử dụng GUID này là duy nhất.

Điều này không làm cho nó độc đáo. Thuật toán của bạn không lưu GUID mới được tạo trong bảng. Lần tới khi bạn tạo GUID, nó có thể va chạm với nó trước đó. Nếu bạn đã chèn GUID vào bảng, GUID có thể đã được chèn bởi một đồng nghiệp khác ở giữa bạn đã kiểm tra tính duy nhất và bạn đã chèn GUID vào bảng. GUID chỉ là duy nhất trong hệ thống CỦA BẠN, vì vậy nếu bạn nhập hoặc hợp nhất hai cơ sở dữ liệu, chúng vẫn có thể va chạm. Ngoài ra GUID thường được sử dụng khi bạn không có quyền truy cập vào cơ sở dữ liệu tập trung. Nếu bạn đã có lý do tại sao không chỉ cần lấy một ID từ cơ sở dữ liệu?
Chạy bộ

0

Phần khó nhất không phải là về việc tạo ra một Hướng dẫn trùng lặp.

Phần khó nhất được thiết kế một cơ sở dữ liệu để lưu trữ tất cả những cái được tạo để kiểm tra xem nó có thực sự trùng lặp hay không.

Từ WIKI:

Ví dụ: số lượng UUID phiên bản 4 ngẫu nhiên cần được tạo để có xác suất 50% cho ít nhất một vụ va chạm là 2,71 triệu, được tính như sau:

nhập mô tả hình ảnh ở đây

Con số này tương đương với việc tạo ra 1 tỷ UUID mỗi giây trong khoảng 85 năm và một tệp chứa nhiều UUID này, ở mức 16 byte mỗi UUID, sẽ khoảng 45 exabyte, lớn hơn nhiều lần so với cơ sở dữ liệu lớn nhất hiện có. thứ tự hàng trăm petabyte


0

GUID là viết tắt của Mã định danh duy nhất toàn cầu

Tóm lại: (đầu mối có trong tên)

Chi tiết: GUID được thiết kế độc đáo; chúng được tính toán bằng một phương pháp ngẫu nhiên dựa trên đồng hồ máy tính và chính máy tính, nếu bạn tạo nhiều GUID trong cùng một mili giây trên cùng một máy thì có thể chúng khớp với nhau nhưng đối với hầu hết mọi hoạt động bình thường thì chúng nên được coi là duy nhấ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.