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?
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
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 ... –
(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). –