2010-09-18 18 views
8

Tôi vừa tạo ra một vài triệu GUID biến chúng thành một String và có chiều dài ... nó luôn luôn giống nhau. Tôi có thể dựa vào chiều dài cố định này của GUID khi chuyển đổi thành String không?Câu hỏi về GUID's: Chúng có luôn cố định chiều dài không và có phải số ở giữa luôn là 4 không?

Ngoài ra, là số giữa của GUID luôn "4" như được hiển thị trong ảnh chụp màn hình này?

alt text

+0

Bạn chỉ có thể dựa vào những gì spec nói về GUID. Nếu spec không đề cập đến một đại diện chuỗi cố định chiều dài, sau đó không dựa vào nó. –

+0

@Keith - Định dạng 8-4-4-4-12 là tiêu chuẩn, cả với MS và OSF. MS tài liệu nói về Guid.ToString() "Giá trị của hướng dẫn này, được định dạng như sau: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" –

+0

Ok, sau đó bạn là tốt. –

Trả lời

8

Vâng, chiều dài là cố định và có, số lượng trung luôn là 4 khi bạn sử dụng định dạng toString chuẩn. Một số các bit trong GUID (được gọi là một UUID hầu như bất cứ nơi nào mà không phải là cửa sổ) được cố định để chỉ những thứ như phiên bản vv ..

http://en.wikipedia.org/wiki/Uuid

EDIT tôi nên thêm rằng "4 "chỉ áp dụng cho các hướng dẫn đã được tạo theo thuật toán Guid.NewGuid như được triển khai trong .NET. Không có gì ngăn cản bạn lấy bất kỳ byte tùy ý nào [16] và chuyển đổi nó thành Guid. Vì vậy, bạn chỉ có thể ngân hàng trên nó là 4 cho việc thực hiện hiện tại của thuật toán trong. Net. Nếu bạn nhận được hướng dẫn từ một nguồn khác, bạn không thể ngân hàng trên 4. Cập nhật cho .Net hoặc có thể là cửa sổ (tùy thuộc vào. Net sử dụng trình tạo của riêng nó hoặc Windows) có thể thay đổi số cố định của GUID

ví dụ sau đây là hoàn toàn đang làm việc và sẽ không có 4 trong số các mục:

 var rand = new Random(); 
     var byteArray = new byte[16]; 
     rand.NextBytes(byteArray); 
     var g = new Guid(byteArray); 
+1

Số 4 là số phiên bản. Nó phụ thuộc vào cách nó được tạo ra, * không * cách bạn chuyển đổi nó thành một chuỗi. – Gabe

+0

Nếu bạn hiển thị GUID dưới dạng số cơ sở-10, sẽ không có vị trí 4 ở vị trí đó. Tâm trí bạn, làm điều đó sẽ trở nên điên rồ, nó chỉ là bạn CÓ THỂ. – mjfgates

+1

@Gabe - để rút ngắn độ dài chuỗi, thủ thuật bán phổ biến là thực hiện chuyển đổi cơ sở 64, trong trường hợp chuỗi không có vị trí 4, nó sẽ che dấu các giá trị cố định. ví dụ: Convert.ToBase64String (guid.ToByteArray()); –

3

Từ documentation on Guid.ToString (không có tham số):

Giá trị của Guid này có định dạng là sau: xxxxxxxx -xxxx-xxxx-xxxx-xxxxxxxxxxxx trong đó giá trị của GUID là được biểu thị dưới dạng một số chữ thường chữ số thập lục phân trong các nhóm 8, 4, 4, 4 và 12 chữ số và cách nhau bằng dấu gạch nối. Ví dụ về giá trị trả lại là "382c74c3-721d-4f34-80e5-57657b6cbc27".

Vì vậy, câu trả lời là "có", nó sẽ luôn là có cùng độ dài.

Đối với 4, đó là số phiên bản (theo http://en.wikipedia.org/wiki/Uuid). Mỗi GUID mà bạn tạo ra với thuật toán đó sẽ có 4 ở vị trí đó, nhưng GUID cũ hơn sẽ có 1, 2, hoặc 3. Những người trong tương lai có thể có 5 hoặc cao hơn.

2

Không - một GUID không phải là một loại 4 UUID trong thực tế nhiều GUIDS dưới cửa sổ là UUID của TYPE 1.

loại 1 lấy MAC tiểu học, một chiếc đồng hồ và một chuỗi. Điều này trong thực tế "Rò rỉ" dữ liệu vì tất cả các UUID1 được tạo ra trên cùng một hệ thống sẽ có cùng một MAC. Đó là lý do tại sao hầu hết các hàm GUID sẽ lấy dữ liệu này và băm nó và biến nó thành UUID

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