Là một GUID duy nhất 100% thời gian?
Nó sẽ duy nhất trên nhiều chủ đề?
Là một GUID duy nhất 100% thời gian?
Nó sẽ duy nhất trên nhiều chủ đề?
Câu trả lời:
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
2^128
viế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.
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.
999999999
ở dạng của bạn, tôi nghĩ Paranoia sẽ làm hỏng Trình duyệt của tôi.
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 :-)
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.
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;)
0FF1CE
GUID 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ị đó.
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.
Guid.NewGuid
luô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.
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
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?
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.
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:
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 n
chọ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ử n
là 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 n
và 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ừ 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.
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ọ.)
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.
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ê.
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.
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.
Để 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();
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ủ:
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 đó :)
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%.
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.
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:
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
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.