2012-02-17 18 views
12

Tôi chỉ tò mò, tôi đã luôn luôn tự hỏi tại sao điều này là như vậy.SQL Server: tại sao char thứ 15 của GUID luôn là 4?

Trong một nỗ lực để tìm hiểu xem tôi có thể tạo ra một mà không có nhân vật 4 ở nhân vật thứ 15, tôi chạy này ...

DECLARE @GUID AS NVARCHAR(36) 
DECLARE @COUNT AS INTEGER 

SET @COUNT = 0 
SET @GUID = CAST(NEWID() AS NVARCHAR(36)) 

WHILE SUBSTRING(@GUID,15,1) = '4' 
BEGIN 
    SET @COUNT = @COUNT + 1 
    SET @GUID = CAST(NEWID() AS NVARCHAR(36)) 
END 

PRINT 'Attempts : ' + CAST(@COUNT AS NVARCHAR(MAX)) 
PRINT @GUID 

Như bạn có thể đoán, điều này không bao giờ thực sự kết thúc đối với tôi. Tôi đã chạy trên một máy chủ vào cuối tuần.

Nếu NewID được cho là luôn cung cấp ID ngẫu nhiên, tại sao 4 luôn ở đó.

BC13DF1C-60FB-41C2-B5B2-8F1A73CF2485 
D790D359-AB3D-4657-A864-FA89FACB3E99 
DF1BBC0C-4205-48E8-A1B6-EA9544D7C6E5 

Vị trí thứ 15 có phải là một loại xác định nào đó đối với hệ thống tạo ra bộ định danh duy nhất không?

Thực tế, điều tương tự cũng xảy ra với chức năng System.Guid.Newguid của VB.net. Là 4 điều duy nhất của Microsoft?

Chỉnh sửa: Có lẽ tôi cũng nên hỏi, chúng có thực sự độc đáo không? Có thể dựa vào một trong số họ là duy nhất trong toàn bộ cơ sở dữ liệu không? Tôi biết hệ thống cơ sở dữ liệu dựa trên giả định này được đảm bảo là duy nhất trong cơ sở dữ liệu. Với hàng triệu bản ghi trong các bảng khác nhau ... có bất kỳ bản ghi nào có khả năng giống nhau không?

Trả lời

7

Số 4 chỉ ra rằng nó được tạo ra bằng cách sử dụng một số giả ngẫu nhiên; Xem Wikipedia's article for Globally Unique Identifiers under Algorithm.

+0

Tôi thấy điều đó, dưới GUID của V4. Nó luôn luôn là một sự tò mò của tôi như tôi cho rằng chúng là duy nhất. Và nếu một byte luôn giống nhau, làm thế nào newid có thể tạo ra một id duy nhất của cơ sở dữ liệu. Chắc chắn phải có cơ hội tạo ra một cái đã được sử dụng. – Elarys

+1

Tỷ lệ cược của việc tạo ra cùng một số hai lần là khá thấp, và các thuật toán mà họ sử dụng (trong đó 4 chỉ định một thuật toán cụ thể) giúp giảm tỷ lệ cược của một bản sao nhiều hơn. Hãy suy nghĩ về bạn và một người bạn mỗi lần lật một đồng xu và nhận được kết quả tương tự mỗi lần cho 122 lần liên tiếp ... –

+0

(Tôi nhận 122 từ RFC được liên kết trên wikipedia - bit 6, 7 và 12-15 được đặt thành các giá trị cụ thể và các bit còn lại (128-6) được chọn ngẫu nhiên). –

7

GUID không hoàn toàn ngẫu nhiên; chúng được tạo theo a specific algorithm, thay đổi đôi chút tùy thuộc vào phiên bản GUID.

Cụ thể, khi chữ số đầu tiên của nhóm thứ ba là 4, nghĩa là đó là GUID v4.

8

Nó liên quan đến phiên bản UUID/GUID và cách nó được đặt cùng nhau. Full details on Wikipedia, tóm tắt:

Trong đại diện kinh điển, xxxxxxxxxxxx-Mxxx-Nxxx-xxxxxxxxxxxx, các bit quan trọng nhất của N cho biết các biến thể (tùy thuộc vào biến thể; một, hai hoặc ba bit được sử dụng). Biến thể được bao hàm bởi đặc tả UUID được chỉ ra bởi hai bit quan trọng nhất của N là 1 0 (tức là hệ thập lục phân N sẽ luôn là 8, 9, a, hoặc b).

Trong phiên bản được bao gồm trong đặc tả UUID, có năm phiên bản. Đối với biến thể này, bốn bit M cho biết phiên bản UUID (tức là hệ thập lục phân M sẽ là 1, 2, 3, 4 hoặc 5).

...

Version 4 (ngẫu nhiên)

Version 4 UUIDs sử dụng một chương trình chỉ dựa vào số ngẫu nhiên. Thuật toán này đặt số phiên bản cũng như hai bit dành riêng. Tất cả các bit khác được đặt bằng cách sử dụng nguồn dữ liệu ngẫu nhiên hoặc giả ngẫu nhiên.

Phiên bản 4 UUID có dạng xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx trong đó x là bất kỳ chữ số thập lục phân nào và y là một trong 8, 9, A hoặc B. ví dụ: f47ac10b-58cc-4372-a567-0e02b2c3d479.

Về cơ bản, chữ số đó là phiên bản của UUID, giải thích cách nó được tạo.4 cho biết ngẫu nhiên, do đó, hàm ý là MSSQL sử dụng thế hệ ngẫu nhiên (ví dụ dựa trên địa chỉ MAC).

Tôi tin rằng, mặc dù không chắc chắn rằng hầu hết các công cụ MS và có thể các chức năng tạo GUID của WinAPI đều tạo UUID phiên bản 4. Liếc nhìn một tán xạ của GUIDs COM, điều này dường như là trường hợp.

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