Có thể va chạm GUID?


128

Tôi đang làm việc trên cơ sở dữ liệu trong SQL Server 2000 sử dụng GUID cho mỗi người dùng sử dụng ứng dụng mà nó gắn với. Bằng cách nào đó, hai người dùng đã kết thúc với cùng một GUID. Tôi biết rằng microsoft sử dụng thuật toán để tạo GUID ngẫu nhiên có khả năng gây ra va chạm cực kỳ thấp, nhưng liệu có thể xảy ra va chạm không?


11
Mọi người nói không là sai. Tôi đã va chạm 1 UniqueIdentifier với bộ dữ liệu dưới nửa triệu bản ghi, MSSQL 2008 R2
Behrooz

2
@Behrooz Yike. Không phải là không thể nhờ bạn của chúng ta nghịch lý sinh nhật, nhưng nó vẫn không may mắn với các GUID v4 hoàn toàn ngẫu nhiên. Có lẽ bạn đang sử dụng chiến lược tạo GUID yếu hơn?
Craig Ringer

6
@Behrooz Wow. Đó là may mắn gây sốc.
Craig Ringer

6
@Behrooz đây có lẽ là một số ngẫu nhiên giả bị lỗi được sử dụng trong MSSQL (Tôi sẽ không ngạc nhiên nếu họ có hạt giống 32 bit trong trình tạo của họ hoặc tương tự với chất lượng phần mềm của họ). Toán học không nói dối. Khả năng này nhỏ đến mức bạn có thể là 99.9999999999 (và rất nhiều sau 9%) rằng trình tạo hướng dẫn MSSQL bị lỗi (hoặc có thể là trình tạo ngẫu nhiên giả được sử dụng để tạo GUID) hoặc bạn đã nhầm.
Alex

2
Yêu như thế nào tại thời điểm chính xác này, cả câu hỏi và câu trả lời được chọn đều có 128 điểm. Sự trùng hợp? 🤔
Caio Cunha

Câu trả lời:


127

Về cơ bản, không. Tôi nghĩ rằng ai đó đã đi mucking với cơ sở dữ liệu của bạn. Tùy thuộc vào phiên bản GUID mà bạn đang sử dụng, giá trị là duy nhất (đối với những thứ như GUID phiên bản 1) hoặc cả độc đáo và không thể đoán trước (đối với những thứ như GUID phiên bản 4). Việc triển khai SQL Server cho hàm NEWID () của họ dường như sử dụng số ngẫu nhiên 128 bit, do đó bạn sẽ không bị xung đột.

Để có 1% cơ hội va chạm, bạn cần tạo khoảng 2.600.000.000.000.000.000 GUID.


3
Đó là những gì tôi đã tìm ra, nhưng tôi chỉ muốn chắc chắn rằng tôi không thể loại trừ điều đó. Bạn không bao giờ biết những loại lỗi kỳ lạ nào có thể xuất hiện trong phần mềm 8 năm tuổi. :)
Jason Baker

6
Thật ra điều đó không còn đúng nữa. Điều này đúng với v1 GUID, nhưng không đúng với v4 hiện tại. Xem en.wikipedia.org/wiki/Globally_Unique_Identifier#Alacticm để biết thêm thông tin.
Greg Beech

96
Bỏ phiếu vì về nguyên tắc (ở dạng raxi), bạn đã sai khi nói "không" với câu hỏi "Có thể va chạm GUID không?". Điều đó rất có thể. Khả năng là rất nhỏ, nhưng nó có thể. Tôi ghét âm thanh mô phạm - nhưng SO là tất cả về ngắn gọn và chính xác.

13
nhập "giải quyết [1-exp [- (n ^ 2 / (2 * 2 ^ 128))]> 0,01, n]" vào wolfram alpha để nhận kết quả cho 1% ... Beaware trong khi con số này có vẻ lớn bối cảnh của MỘT ứng dụng, nó chắc chắn không lớn đối với toàn thế giới. Nếu mọi máy tính trên trái đất sẽ tạo ra GUID thực sự, chúng sẽ gây ra xung đột với xác suất 1% trong khoảng một giây, giả sử chúng có thể tạo GUID mỗi nano giây (có lẽ khá thực tế trong những ngày này). Vì vậy, nếu bạn sử dụng GUID cho ID cơ sở dữ liệu của mình, thì chúng là duy nhất. GUID cho mọi tính toán được thực hiện trên trái đất, sẽ va chạm ngay lập tức.
thesaint

11
Nói 'Không' là không thể, và sau đó nói rằng có 1% khả năng bị va chạm khi một số tiền nhất định được tạo ra, là xung đột trực tiếp. Câu trả lời đúng phải theo lý thuyết - vâng, một vụ va chạm có thể xảy ra ngẫu nhiên. Tuy nhiên, khả năng xảy ra va chạm nhỏ hơn về mặt thống kê so với một tiểu hành tinh đâm vào Trái đất, bật khỏi Trái đất và bật khỏi Mặt trăng để tấn công Trái đất lần thứ hai, trong giờ tiếp theo.
Baaleos

112

Về cơ bản là không thể! , cơ hội là thấp về mặt thiên văn .

Nhưng ... Tôi là người duy nhất mà tôi biết đến trên thế giới mà tôi đã từng có một khu vực GUID một lần (vâng!).

Và tôi chắc chắn về điều đó, và đó không phải là một sai lầm.

Làm thế nào nó xảy ra, trong một ứng dụng nhỏ đang chạy trên Pocket PC, khi kết thúc một hoạt động, một lệnh có GUID được tạo phải được ban hành. Lệnh sau khi được thực thi trên máy chủ, nó được lưu trữ trong bảng lệnh trên máy chủ cùng với ngày thực hiện. Một ngày nọ khi tôi gỡ lỗi, tôi đã ban hành lệnh mô-đun (có GUID mới được tạo) kèm theo và không có gì xảy ra. Tôi đã làm lại (với cùng một hướng dẫn, bởi vì hướng dẫn chỉ được tạo một lần khi bắt đầu hoạt động), và một lần nữa, và không có gì, cuối cùng cố gắng tìm hiểu tại sao lệnh không thực thi, tôi đã kiểm tra bảng lệnh, và GUID giống như cái hiện tại đã được chèn 3 tuần trước. Không tin vào điều này, tôi đã khôi phục cơ sở dữ liệu từ bản sao lưu 2 tuần và hướng dẫn đã có. Đã kiểm tra mã, hướng dẫn mới được tạo mới không còn nghi ngờ gì nữa.

Chỉnh sửa: có một số yếu tố có thể làm tăng đáng kể khả năng xảy ra sự cố này, ứng dụng đang chạy trên trình giả lập PocketPC và trình giả lập có tính năng lưu trạng thái, có nghĩa là mỗi khi khôi phục trạng thái, thời gian cục bộ cũng được khôi phục và hướng dẫn dựa trên bộ định thời bên trong .... đồng thời thuật toán tạo hướng dẫn cho khung nhỏ gọn có thể chưa hoàn chỉnh hơn ví dụ như COM ...


38
Nâng cao. Lưu trạng thái & phát lại thực sự sẽ tạo ra các hướng dẫn trùng lặp.
Joshua

35
Có khả năng những gì đã xảy ra là đây là một triển khai GUID "xấu". Các lý thuyết tỷ lệ cược là rất thấp, nhưng trên Pocket PC ?? Ai sẽ nói rằng họ đã không chọn một lối tắt đưa các tỷ lệ cược đó vào danh mục "không thể, nhưng có thể".
Dave Dopson

9
Chỉ vì điều gì đó có xác suất xảy ra rất thấp không có nghĩa là nó sẽ không xảy ra.
Renan

3
Như tôi đã nói ở trên, cơ hội ngày càng nhỏ đến mức có thể an toàn khi cho rằng bạn đã phạm sai lầm hoặc MSSQL sử dụng PRNG bị lỗi ( en.wikipedia.org/wiki/Pseudorandom_number_generator ). Ví dụ, có khả năng PRNG này được kích thích với một hạt có kích thước nhỏ. PRNGs khiếm khuyết là không hiếm (xem schneier.com/paper-prngs.html ) - ví dụ một khiếm khuyết thời gian gần đây đã được phát hiện trong Android SDK - android-developers.blogspot.com/2013/08/... + usenix.org/conference/woot14 / hội thảo-chương trình / thuyết trình / đào
Alex

2
@Alex, lỗi là "Lưu trạng thái và khôi phục" từ Trình giả lập, khôi phục toàn bộ hình ảnh giả lập bao gồm cả đồng hồ giả lập. Vì vậy, sau hàng ngàn hoạt động Khôi phục trong một năm, một xung đột hướng dẫn đã được tạo. Bạn đúng là có một sai lầm!
Pop Catalin

34

Về mặt lý thuyết là có thể, nhưng với số 3,4E38 có thể, nếu bạn tạo ra hàng chục nghìn tỷ GUID trong một năm, cơ hội có một bản sao là 0,0000000000006 ( Nguồn ).

Nếu hai người dùng kết thúc với cùng một GUID, tôi sẽ đặt cược rằng có một lỗi trong chương trình khiến dữ liệu bị sao chép hoặc chia sẻ.


"nhưng với số 3,4E38 có thể" - không. Hai GUID được tạo gần như đồng thời trên cùng một máy sẽ kết thúc với GUID cực kỳ giống nhau.
Kirk Strauser

4
Điều đó phụ thuộc vào cách tạo GUID và một số triển khai dựa trên thời gian CPU hoặc mili giây sẽ (hy vọng) sẽ loại bỏ bất kỳ phép tính nào dựa trên việc hai GUID được tạo ra cách nhau một phần nghìn giây sẽ có sự khác biệt lớn.
Dalin Seivewright

4
Với nhiều hơn 1 bộ xử lý trên một máy, nếu một hướng dẫn dựa trên thời gian và địa chỉ mac thì mỗi lõi có thể phát hành cùng một hướng dẫn tại cùng một thời điểm.
AndyM

12
Tôi khá chắc chắn rằng bất kỳ triển khai GUID phong nha nào cũng sẽ không
Guillaume86

1
@MatthewLock Nghịch lý sinh nhật được đề cập trong nguồn. Kiểm tra liên kết.
Zero3

21

Đầu tiên chúng ta hãy xem xét khả năng va chạm của hai GUID. Không phải, như các câu trả lời khác đã nêu, 1 trong 2 ^ 128 (10 ^ 38) vì nghịch lý sinh nhật , điều đó có nghĩa là với 50% khả năng hai GUID va chạm xác suất thực sự là 1 trên 2 ^ 64 (10 ^ 19) nhỏ hơn rất nhiều. Tuy nhiên, đây vẫn là một con số rất lớn và do đó xác suất xảy ra va chạm giả sử bạn đang sử dụng số lượng GUID hợp lý là thấp.

Cũng lưu ý rằng GUID không chứa dấu thời gian hoặc địa chỉ MAC vì nhiều người dường như cũng tin. Điều này đúng với v1 GUID nhưng hiện tại v4 GUID được sử dụng, đơn giản là một số giả ngẫu nhiên , có nghĩa là khả năng va chạm cao hơn nhiều vì chúng không còn là duy nhất đối với thời gian và máy móc.

Vì vậy, về cơ bản câu trả lời là có, va chạm là có thể. Nhưng chúng rất khó xảy ra.

Chỉnh sửa: đã sửa thành 2 ^ 64


2
Trong khi tôi đồng ý với tất cả các sự kiện của bạn, hãy cẩn thận với toán học của bạn. Để nói rằng bạn có 1 trong 10 ^ 19 cơ hội có bất kỳ hai GUID nào va chạm tùy thuộc vào số lượng GUID trong tập hợp. Để có cơ hội đó, bạn cần ~ 2 ^ 32 GUID, vì vậy trong gần như tất cả các kịch bản trong thế giới thực, tỷ lệ cược thấp hơn nhiều.
DocMax

1
Bạn có một lỗi đánh máy 1 in 10^64 (10^19), mà tôi nghĩ nên được 1 in 2^64 (10^19). Tôi cũng rất bối rối khi bạn nghĩ nghịch lý sinh nhật chỉ áp dụng cho 2 số. Tôi giả sử bạn đã xem en.wikipedia.org/wiki/B birthday_paradox . Bảng này cho thấy bạn cần bao nhiêu hướng dẫn cho xác suất trùng lặp. Từ bảng đó, xác suất 1 trong 10 ^ 18 yêu cầu 2,6 * 10 ^ 10 hướng dẫn, không phải bất cứ thứ gì gần với chỉ hai GUID.
Tony Lee

Các hướng dẫn một điểm - v1 vẫn đang được sử dụng rộng rãi và dựa vào địa chỉ MAC, đặc biệt là trong cơ sở dữ liệu vì chúng có các đặc điểm mong muốn. Xem UuidCreateSequential và đó là trình bao bọc SQL Server NewSequentialID ( msdn.microsoft.com/en-us/l Library / windows / desktop / sắt ).
EBarr

18

Khả năng hai GUID ngẫu nhiên va chạm (~ 1 trên 10 ^ 38) thấp hơn cơ hội không phát hiện ra gói TCP / IP bị hỏng (~ 1 trên 10 ^ 10). http://wwwse.inf.tu-dresden.de/data/cifts/SE1/SE1-2004-lec12.pdf , trang 11. Điều này cũng đúng với ổ đĩa, ổ đĩa cd, v.v ...

GUID là duy nhất về mặt thống kê và dữ liệu bạn đọc từ db chỉ đúng về mặt thống kê.


Bạn có chắc là tôi không thể bảo vệ mạng của mình nên có ít hơn 1 trong 10 ^ 28 gói bị hỏng không?
Joshua

13

Tôi sẽ coi dao cạo của Occam là một hướng dẫn tốt trong trường hợp này. Rất khó có khả năng bạn bị va chạm GUID. Nhiều khả năng bạn có một lỗi, hoặc ai đó làm hỏng dữ liệu của bạn.


1
Trên thực tế trong tình huống này, dao cạo của Occam không phải là một hướng dẫn tốt! Occam's Razor nói rằng trường hợp có ít giả định nhất có khả năng là chính xác. Trong tình huống này, trường hợp va chạm GUID thực sự đơn giản hơn nhiều, nhưng Occam's Razor không áp dụng cho tình huống như thế này khi chúng ta đã biết rằng một trong những trường hợp rất khó xảy ra.
lockstock

11

Xem Định danh toàn cầu duy nhất của Wikipedia bài viết . Có một số cách để tạo GUID. Rõ ràng cách cũ (?) Đã sử dụng địa chỉ Mac, dấu thời gian xuống một đơn vị rất ngắn và bộ đếm duy nhất (để quản lý các thế hệ nhanh trên cùng một máy tính), do đó, việc sao chép chúng là gần như không thể. Nhưng những GUID này đã bị loại bỏ vì chúng có thể được sử dụng để theo dõi người dùng ...

Tôi không chắc chắn về thuật toán mới được Microsoft sử dụng (bài báo nói rằng một chuỗi GUID có thể dự đoán được, có vẻ như chúng không còn sử dụng dấu thời gian nữa? Bài báo của Microsoft được liên kết ở trên nói về điều gì khác ...).

Bây giờ, GUID được thiết kế cẩn thận, theo tên, là duy nhất trên toàn cầu, vì vậy tôi sẽ mạo hiểm điều đó là không thể, hoặc có xác suất rất rất thấp. Tôi sẽ tìm nơi khác.





9

Hai máy Win95 có thẻ ethernet có địa chỉ MAC trùng lặp sẽ phát hành GUIDS trùng lặp trong các điều kiện được kiểm soát chặt chẽ, đặc biệt là, ví dụ, nếu mất điện trong tòa nhà và cả hai đều khởi động cùng một lúc.


Có phải thông thường hai máy khác nhau có cùng địa chỉ MAC ethernet không?
Dave Lucre

@DaveLucre: Không, nhưng sự cố đã được ghi lại.
Joshua

Tôi thực sự tò mò làm thế nào điều này xảy ra. Có nhiều khả năng với các VM tạo ngẫu nhiên MAC cho mỗi NIC không? Tôi chưa bao giờ nghe nói về các NIC vật lý được sản xuất với các MAC trùng lặp! Loại ném một cờ lê lớn trong công trình nếu điều đó có thể!
Dave Lucre

Ồ Cảm ơn vì đường dẫn @Joshua! Thật là một sự sai lầm khổng lồ!
Dave Lucre

@DaveLucre Tôi đã sử dụng một số USB USB rất rẻ trong đó TẤT CẢ chúng được sản xuất với cùng một MAC. Nhưng tất nhiên, điều đó không liên quan gì đến toán học về tính ngẫu nhiên, và mọi thứ liên quan đến sự lười biếng của nhà sản xuất.
rudolfbyker

5

Tôi sẽ nói trước điều này với "Tôi không phải là người kết nối mạng, vì vậy tôi có thể đưa ra những câu hoàn toàn không mạch lạc sau đây."

Khi tôi làm việc tại Đại học bang Illinois, chúng tôi có hai máy tính để bàn Dell, được đặt hàng vào những thời điểm khác nhau. Chúng tôi đã đặt cái đầu tiên lên mạng, nhưng khi chúng tôi cố gắng đưa cái thứ hai lên mạng, chúng tôi bắt đầu nhận được những lỗi điên rồ. Sau nhiều lần khắc phục sự cố, đã xác định rằng cả hai máy đều sản xuất cùng một GUID (Tôi không chắc chính xác là để làm gì, nhưng nó khiến cả hai không thể sử dụng được trên mạng). Dell thực sự đã thay thế cả hai máy là lỗi.


3
Nó đặc biệt là HƯỚNG DẪN. Nó có liên quan đến GUID được tạo bởi các máy khi chúng tham gia mạng. Phải mất vài tuần để Dell thay thế máy móc vì họ nói rằng GUID không thể giống nhau. Chúng tôi đã có thể tái tạo vấn đề, Dell đã lấy lại máy và có thể tạo ra kết quả tương tự trên mạng của họ. Họ đã kết thúc việc thay thế cả hai máy. Như tôi đã nói, tôi không phải là một người kết nối mạng, nhưng tôi đặc biệt nhớ đó là một vấn đề với GUID.
John Kraft

5

Tôi biết mọi người thích câu trả lời dễ hiểu rằng GUID là huyền diệu và được đảm bảo là duy nhất, nhưng trong thực tế, hầu hết các GUID chỉ là các số ngẫu nhiên 121 bit (bảy trong số các bit bị lãng phí khi định dạng). Nếu bạn không cảm thấy thoải mái khi sử dụng một số ngẫu nhiên lớn, thì bạn không nên cảm thấy thoải mái khi sử dụng GUID.


11
Cũng khuyên bạn không nên sử dụng mạng. Hoặc máy tính. Các bit chẵn lẻ chỉ có thể làm rất nhiều!
Rushyo

Bạn hiểu lầm. Có hai điều tôi đã cố gắng nói trong bài này: 1) Nếu bạn cần một số ngẫu nhiên lớn, hãy sử dụng một số ngẫu nhiên lớn. Sử dụng GUID như một số ngẫu nhiên lớn là không cần thiết gây hiểu lầm. (2)
Rick Yorgason

4
Mà tôi hoàn toàn nhận thức được. Bạn đã nói "nếu bạn không cảm thấy thoải mái khi sử dụng một số ngẫu nhiên lớn." nhưng GUID độc đáo đến mức bạn thấy rằng hầu hết mọi thứ khác trong máy tính đều ngẫu nhiên hơn, ngay cả các thao tác bạn thực hiện là điều hiển nhiên. Có nhiều khả năng một trục trặc bộ nhớ kỳ dị sẽ phá vỡ cột nhận dạng của bạn hơn là một vụ va chạm GUID (thật) sẽ xảy ra. Bạn không nên cảm thấy 'khó chịu' về họ. Nếu chúng không lý tưởng cho kịch bản thì tốt - nhưng chúng không cần thận trọng đặc biệt.
Rushyo

3
Tôi đoán điều này sẽ không đi đến đâu nhưng điều mọi người đang cố gắng giải thích với bạn là các lỗi phát hiện lỗi trong phần cứng phổ biến như card mạng hoặc ổ cứng sử dụng thuật toán có khả năng không phát hiện ra lỗi lớn hơn bạn khi gặp xung đột GUID, vì vậy nếu bạn dựa vào những điều này, bạn cũng có thể dựa vào GUID
Guillaume86

1
@Rick, phụ thuộc vào số của bạn lớn như thế nào. Chắc chắn không phải với một intint 4 byte hoặc 8 byte. GUID = 16 byte, do đó bạn cần triển khai số lớn 16 byte tùy chỉnh để đạt được cùng 2 ^ 128 kết hợp có thể. Vì vậy, nói chung, nếu sử dụng các số ngẫu nhiên int hoặc bigint 'bình thường', cơ hội va chạm với GUID sẽ thấp hơn (bỏ qua các cân nhắc về thuật toán ngẫu nhiên cho mỗi số).
Wim Hollebrandse

3

Mã được sử dụng để tạo GUID có lỗi không? Vâng, tất nhiên nó có thể. Nhưng câu trả lời giống như lỗi của trình biên dịch - mã riêng của bạn là các lệnh có độ lớn có khả năng bị lỗi hơn, vì vậy hãy nhìn vào đó trước.


2

Tất nhiên là có thể .... Có thể? Không có khả năng, nhưng nó có thể.

Hãy nhớ rằng, cùng một máy đang tạo ra mọi GUID (máy chủ), do đó, rất nhiều "tính ngẫu nhiên" dựa trên thông tin cụ thể của máy bị mất.


1

Chỉ dành cho grins, hãy thử tập lệnh sau ... (hoạt động trên SQL 2005, không chắc chắn về năm 2000)

declare @table table
(
    column1 uniqueidentifier default (newid()),
    column2 int,
    column3 datetime default (getdate())
)

declare @counter int

set @counter = 1

while @counter <= 10000
begin
    insert into @table (column2) values (@counter)
    set @counter = @counter + 1
end

select * from @table

select * from @table t1 join @table t2 on t1.column1 = t2.column1 and t1.column2 != t2.column2

Chạy liên tục (mất ít hơn một giây) sẽ tạo ra một phạm vi khá rộng từ lựa chọn đầu tiên, ngay cả với khoảng cách thời gian ngắn TUYỆT VỜI. Cho đến nay lựa chọn thứ hai đã không sản xuất bất cứ điều gì.


1
Bạn cần thêm 15 số không ở cuối quầy để có 50% cơ hội trùng lặp. Nhưng, vì lợi ích của Pete, đừng làm điều đó!
Jim Birchall

0

Không thể nếu người dùng có các máy khác nhau với card mạng, và ngay cả khi không, nó vẫn là một rủi ro cực kỳ gần như lý thuyết.

Cá nhân tôi sẽ tìm nơi khác vì nó có nhiều khả năng là một lỗi hơn là một cuộc đụng độ GUID ...

Tất nhiên cung cấp rằng bạn không cắt các bit khỏi GUID để làm cho nó ngắn hơn.


GUID sẽ được tạo trên Máy chủ, vì vậy các card mạng của người dùng sẽ không hoạt động.
Tom Ritter

0

Chắc chắn là nó có thể, và thậm chí có khả năng. Không giống như mỗi GUID nằm trong một phần ngẫu nhiên của không gian số có thể. Trong trường hợp hai luồng cố gắng tạo ra một luồng đồng thời, chặn một số loại hàm GUID tập trung với một semaphore xung quanh nó, chúng có thể có cùng giá trị.


0

Rất có khả năng bạn sẽ gặp phải các va chạm GUID nếu bạn tạo chúng thông qua một cái gì đó giống như NEWID()chức năng trong SQL Server (mặc dù tất nhiên là có thể, như các câu trả lời khác đã nhấn mạnh). Một điều họ chưa chỉ ra là thực sự rất có khả năng bạn sẽ gặp phải các vụ va chạm nếu bạn đang tạo GUID bằng JavaScript trên các trình duyệt. Đôi khi không chỉ có vấn đề về RNG trong các trình duyệt khác nhau, mà tôi còn gặp phải các vấn đề trong đó các trình thu thập dữ liệu của Google dường như lưu trữ kết quả của các chức năng như vậy và cuối cùng đã chuyển cùng một GUID cho các hệ thống của chúng tôi.

Xem các câu trả lời khác nhau ở đây để biết thêm chi tiết:

Va chạm khi tạo UUID trong JavaScript?

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.