2016-03-31 20 views
11

Tôi muốn đính kèm UUID vào một trường trong ví dụ thư của người dùng protobuf của tôi.Làm cách nào để trình bày UUID trong thông điệp protobuf?

message User { 
    // field containing id as UUID type 
    required string email; 
    optional string name; 
} 

Tôi biết rằng thư protobuf chưa hỗ trợ loại UUID. Tôi đã đọc rằng cách tiếp cận tốt nhất là có một loại thông điệp UUID.

Vì vậy, tôi đoán nhắn tài khoản của tôi sẽ nhập định nghĩa proto nhắn UUID của tôi và sử dụng nó như một loại lĩnh vực như sau:

import "myproject/UUID.proto"; 

message User { 
    required UUID id; 
    required string email; 
    optional string name; 
} 

Câu hỏi của tôi là, làm thế nào sẽ được thông báo UUID cái nhìn như thế nào, và làm thế nào Tôi sẽ mã hóa/giải mã nó? Tôi đang hướng tới khả năng tương thích Java/Scala và C#.

Trả lời

13

Có thể bạn nên sử dụng string hoặc bytes để đại diện cho UUID. Sử dụng string nếu thuận tiện nhất để giữ UUID ở định dạng có thể đọc được bằng con người (ví dụ: "de305d54-75b4-431b-adb2-eb6b9e546014") hoặc sử dụng bytes nếu bạn đang lưu trữ giá trị 128 bit thô. (Nếu bạn không chắc chắn, bạn có thể muốn string.)

Bao bọc giá trị trong một loại thư được gọi là UUID có thể hữu ích để làm cho mã tự ghi hơn nhưng sẽ có một số chi phí hoạt động và không được yêu cầu nghiêm ngặt . Nếu bạn muốn làm điều này, xác định các loại như:

message UUID { 
    required string value = 1; 
} 

hay:

message UUID { 
    required bytes value = 1; 
} 
+0

Cảm ơn Kenton, câu trả lời của bạn rõ ràng và hữu ích. Tôi nghĩ rằng tôi sẽ cố gắng và đi theo con đường của việc sử dụng byte để tin nhắn tiêu thụ chỉ là một chút ít băng thông. UUID có dạng «xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx', bạn có biết cách lấy giá trị thô 128 bit từ biểu mẫu này theo cách hiệu quả nhất có thể không? Hoặc bất kỳ tài nguyên trực tuyến nào có thể giúp tôi đi đúng hướng? –

+0

Không bao giờ, lưu trữ UUID dưới dạng chuỗi khiến mọi thứ trở nên đau đớn hơn nhiều ... –

+0

@Hyperreal: FWIW, để chuyển đổi thành byte, bạn sẽ xóa dấu gạch ngang và sau đó diễn giải phần còn lại dưới dạng chuỗi thập phân - mỗi hai chữ số trở thành byte . Nhưng yeah, có thể lưu trữ một chuỗi là dễ dàng hơn. –

4

Nếu bất cứ điều gì, bạn muốn sử dụng string để tránh vấn đề với endian. Lưu ý rằng một UUID và một MS GUID có cùng một biểu diễn chuỗi (và do đó là cùng một "id") có, tuy nhiên, khác nhau byte-thứ tự dòng (big-endian vs little-endian). Nếu bạn sử dụng bytes trong giao thức để liên lạc giữa Java bằng UUID và C# bằng System.Guid, bạn có thể kết thúc với các ID bị lật.

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