Định dạng UUID: 8-4-4-4-12 - Tại sao?


84

Tại sao UUID được trình bày ở định dạng "8-4-4-4-12" (chữ số)? Tôi đã xem xét lý do nhưng không thể tìm ra quyết định phù hợp.

Ví dụ về UUID được định dạng dưới dạng chuỗi hex: 58D5E212-165B-4CA0-909B-C86B9CEE0111


11
Trên thực tế, ví dụ về chuỗi hex đó không chính xác. Các đặc tả UUID đòi hỏi rằng chuỗi hex đại diện cho một giá trị UUID phải được viết thường . Đặc tả cũng yêu cầu một triển khai để có thể phân tích cú pháp một chuỗi chữ hoa hoặc chữ hoa hỗn hợp, nhưng chỉ có thể tạo chữ thường. Rất tiếc, các cách triển khai phổ biến đều vi phạm quy tắc này, bao gồm cả các quy tắc của Apple, Microsoft và những người khác.
Basil Bourque

1
Basil thú vị, cảm ơn
Fidel

Câu trả lời:


65

Nó được phân tách bằng time, version, clock_seq_hi, clock_seq_lo, node, như được chỉ ra trong rfc tiếp theo.

Từ IETF RFC4122:

4.1.2.  Layout and Byte Order

   To minimize confusion about bit assignments within octets, the UUID
   record definition is defined only in terms of fields that are
   integral numbers of octets.  The fields are presented with the most
   significant one first.

   Field                  Data Type     Octet  Note
                                        #

   time_low               unsigned 32   0-3    The low field of the
                          bit integer          timestamp

   time_mid               unsigned 16   4-5    The middle field of the
                          bit integer          timestamp

   time_hi_and_version    unsigned 16   6-7    The high field of the
                          bit integer          timestamp multiplexed
                                               with the version number  

   clock_seq_hi_and_rese  unsigned 8    8      The high field of the
   rved                   bit integer          clock sequence
                                               multiplexed with the
                                               variant

   clock_seq_low          unsigned 8    9      The low field of the
                          bit integer          clock sequence

   node                   unsigned 48   10-15  The spatially unique
                          bit integer          node identifier

   In the absence of explicit application or presentation protocol
   specification to the contrary, a UUID is encoded as a 128-bit object,
   as follows:

   The fields are encoded as 16 octets, with the sizes and order of the
   fields defined above, and with each field encoded with the Most
   Significant Byte first (known as network byte order).  Note that the
   field names, particularly for multiplexed fields, follow historical
   practice.

   0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          time_low                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       time_mid                |         time_hi_and_version   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         node (2-5)                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

11
Tại sao dấu thời gian được chia thành ba phần?
dùng253751

4
Cách các trường được tạo phụ thuộc vào phiên bản UUID. Phương pháp ưa thích không sử dụng thời gian vì điều đó tiết lộ thời gian ID được tạo (một mối quan tâm tiềm ẩn về bảo mật). en.wikipedia.org/wiki/…
pmont

1
@pmont "Ưu tiên"?
Basil Bourque

2
@brocoli Tôi phải không đồng ý. V4 phụ thuộc vào một bộ tạo số ngẫu nhiên mã hóa mạnh mẽ, đó là nhiều khó khăn hơn để xây dựng tốt hơn chỉ đơn giản là lấy các địa chỉ MAC , thời điểm hiện tại, và một số tùy ý incrementing, như đã thấy trong V1 UUID. Hơn nữa, việc triển khai V1 nói chung là mã nguồn mở và được xây dựng từ nhiều năm trước, được sử dụng nhiều trong toàn ngành, giờ đã quá cũ. Tuyên bố V1 là "dễ bị thất bại một phần" chỉ là ngớ ngẩn. UUID V1 là phần cuối cùng trong hệ thống của bạn, nơi bạn cần phải lo lắng về sự thất bại.
Basil Bourque

2
@BasilBourque Một trong những vấn đề mà bạn có thể thấy bây giờ với sự gia tăng của các vùng chứa và mạng vùng chứa là xung đột địa chỉ MAC. Thông thường, các thùng chứa và máy ảo lấy từ một số địa chỉ MAC có thể có giới hạn. IIRC Hyper-V chỉ lấy từ một nhóm 256 địa chỉ MAC có thể theo mặc định.
Nathan Clayton

12

Định dạng được xác định trong IETF RFC4122 trong phần 3. Định dạng đầu ra được xác định khi có nội dung "UUID = ..."

3.- Mẫu đăng ký không gian tên

ID không gian tên: UUID Thông tin đăng ký: Ngày đăng ký: 2003-10-01

Người đăng ký không gian tên đã khai báo: JTC 1 / SC6 (Nhóm báo cáo viên ASN.1)

Khai báo cấu trúc cú pháp: UUID là một định danh duy nhất trên cả không gian và thời gian, đối với không gian của tất cả các UUID. Vì UUID có kích thước cố định và chứa trường thời gian nên các giá trị có thể di chuyển qua lại (khoảng 3400 AD, tùy thuộc vào thuật toán cụ thể được sử dụng). Một UUID có thể được sử dụng cho nhiều mục đích, từ gắn thẻ các đối tượng có thời gian tồn tại cực kỳ ngắn, đến xác định một cách đáng tin cậy các đối tượng rất bền vững trên toàn mạng.

  The internal representation of a UUID is a specific sequence of
  bits in memory, as described in Section 4.  To accurately
  represent a UUID as a URN, it is necessary to convert the bit
  sequence to a string representation.

  Each field is treated as an integer and has its value printed as a
  zero-filled hexadecimal digit string with the most significant
  digit first.  The hexadecimal values "a" through "f" are output as
  lower case characters and are case insensitive on input.

  The formal definition of the UUID string representation is
  provided by the following ABNF [7]:

  UUID                   = time-low "-" time-mid "-"
                           time-high-and-version "-"
                           clock-seq-and-reserved
                           clock-seq-low "-" node
  time-low               = 4hexOctet
  time-mid               = 2hexOctet
  time-high-and-version  = 2hexOctet
  clock-seq-and-reserved = hexOctet
  clock-seq-low          = hexOctet
  node                   = 6hexOctet
  hexOctet               = hexDigit hexDigit
  hexDigit =
        "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
        "a" / "b" / "c" / "d" / "e" / "f" /
        "A" / "B" / "C" / "D" / "E" / "F"

4

128 bit

Định dạng "8-4-4-4-12" chỉ dành cho con người đọc. Các UUID thực sự là một 128-bit số.

Hãy xem xét định dạng chuỗi yêu cầu số byte gấp đôi so với số 128 bit khi được lưu trữ hoặc trong bộ nhớ. Tôi khuyên bạn nên sử dụng số nội bộ và khi nó cần được hiển thị trên giao diện người dùng hoặc xuất ra tệp, hãy sử dụng định dạng chuỗi.

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.