Làm cách nào để giải mã UUID bằng Python?
PyMongo vận chuyển với hỗ trợ tích hợp để xử lý các loại UUID. Thật đơn giản để lưu trữ các đối tượng 00112233-4455-6677-8899-aabbccddeeff3 gốc vào MongoDB và truy xuất chúng dưới dạng các đối tượng 00112233-4455-6677-8899-aabbccddeeff3 gốc Show
from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient(uuidRepresentation='standard') collection = client.get_database('uuid_db').get_collection('uuid_coll') # remove all documents from collection collection.delete_many({}) # create a native uuid object uuid_obj = uuid4() # save the native uuid object to MongoDB collection.insert_one({'uuid': uuid_obj}) # retrieve the stored uuid object from MongoDB document = collection.find_one({}) # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj Các đối tượng gốc 00112233-4455-6677-8899-aabbccddeeff3 cũng có thể được sử dụng như một phần của truy vấn MongoDB document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj Các ví dụ trên minh họa trường hợp sử dụng đơn giản nhất - trường hợp mà UUID được tạo bởi và được sử dụng trong cùng một ứng dụng. Tuy nhiên, tình huống có thể phức tạp hơn đáng kể khi xử lý việc triển khai MongoDB có chứa các UUID được tạo bởi các trình điều khiển khác vì các trình điều khiển Java và CSharp đã mã hóa các UUID trong lịch sử bằng cách sử dụng thứ tự byte khác với thứ tự được sử dụng bởi PyMongo. Các ứng dụng yêu cầu khả năng tương tác giữa các trình điều khiển này phải chỉ định 00112233-4455-6677-8899-aabbccddeeff6 thích hợp Trong các phần sau, chúng tôi mô tả cách các trình điều khiển khác nhau về mặt lịch sử trong mã hóa UUID của chúng và cách các ứng dụng có thể sử dụng tùy chọn cấu hình 00112233-4455-6677-8899-aabbccddeeff6 để duy trì khả năng tương thích giữa các ngôn ngữ Chú ý Các ứng dụng mới không chia sẻ triển khai MongoDB với bất kỳ ứng dụng nào khác và chưa từng lưu trữ UUID trong MongoDB nên sử dụng đại diện UUID của 00112233-4455-6677-8899-aabbccddeeff8 để tương thích giữa các ngôn ngữ. Xem Định cấu hình Đại diện UUID để biết chi tiết về cách định cấu hình 00112233-4455-6677-8899-aabbccddeeff6. Xử lý kế thừa dữ liệu UUID¶Trong lịch sử, Trình điều khiển MongoDB đã sử dụng các thứ tự byte khác nhau trong khi tuần tự hóa các loại UUID thành 00112233-4455-6677-8899-aabbccddeeff0. Ví dụ, hãy xem xét một UUID với biểu diễn văn bản chính tắc sau 00112233-4455-6677-8899-aabbccddeeff UUID này trong lịch sử sẽ được trình điều khiển Python tuần tự hóa dưới dạng 00112233-4455-6677-8899-aabbccddeeff UUID tương tự trong lịch sử sẽ được trình điều khiển C# tuần tự hóa như 00112233-4455-6677-8899-aabbccddeeff2 Cuối cùng, cùng một UUID trong lịch sử sẽ được trình điều khiển Java tuần tự hóa thành 00112233-4455-6677-8899-aabbccddeeff3 Ghi chú Để biết thông tin chuyên sâu về thứ tự byte được sử dụng trong lịch sử bởi các trình điều khiển khác nhau, hãy xem Xử lý đặc tả loại UUID gốc Sự khác biệt về thứ tự byte của UUID được mã hóa bởi các trình điều khiển khác nhau có thể dẫn đến hành vi rất không trực quan trong một số trường hợp. Chúng tôi trình bày chi tiết hai kịch bản như vậy trong các phần tiếp theo cảnh 1. Ứng dụng Chia sẻ Triển khai MongoDB¶Xem xét tình huống sau
Ví dụ này cho thấy thứ tự byte khác nhau được sử dụng bởi các trình điều khiển khác nhau có thể cản trở khả năng tương tác như thế nào. Để khắc phục sự cố này, người dùng nên định cấu hình 00112233-4455-6677-8899-aabbccddeeff20 của họ bằng 00112233-4455-6677-8899-aabbccddeeff6 thích hợp (trong trường hợp này, 00112233-4455-6677-8899-aabbccddeeff22 trong ứng dụng 00112233-4455-6677-8899-aabbccddeeff5 có thể được định cấu hình để sử dụng biểu diễn 00112233-4455-6677-8899-aabbccddeeff24 nhằm tránh hành vi không trực quan) như được mô tả trong Định cấu hình . . kịch bản 2. Round-Tripping UUID¶Trong các ví dụ sau, chúng ta thấy cách sử dụng 00112233-4455-6677-8899-aabbccddeeff6 bị định cấu hình sai có thể khiến ứng dụng vô tình thay đổi loại phụ 00112233-4455-6677-8899-aabbccddeeff0 và trong một số trường hợp, chính các byte của trường 00112233-4455-6677-8899-aabbccddeeff0 khi chuyển vòng tài liệu chứa UUID Xem xét tình huống sau 00112233-4455-6677-8899-aabbccddeeff4 Trong ví dụ này, quay vòng tài liệu bằng cách sử dụng sai 00112233-4455-6677-8899-aabbccddeeff6 ( 00112233-4455-6677-8899-aabbccddeeff29 thay vì 00112233-4455-6677-8899-aabbccddeeff30) sẽ thay đổi loại phụ 00112233-4455-6677-8899-aabbccddeeff0 dưới dạng tác dụng phụ. Lưu ý rằng điều này cũng có thể xảy ra khi tình huống đảo ngược - i. e. khi tài liệu gốc được viết bằng cách sử dụng biểu diễn ``STANDARD`` và sau đó được lặp lại bằng cách sử dụng biểu diễn ``PYTHON_LEGACY`` Trong ví dụ tiếp theo, chúng ta thấy hậu quả của việc sử dụng sai cách biểu diễn làm thay đổi thứ tự byte ( 00112233-4455-6677-8899-aabbccddeeff24 hoặc 00112233-4455-6677-8899-aabbccddeeff33) khi chuyển đổi tài liệu document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj0 Trong trường hợp này, việc sử dụng sai 00112233-4455-6677-8899-aabbccddeeff6 ( 00112233-4455-6677-8899-aabbccddeeff33 thay vì 00112233-4455-6677-8899-aabbccddeeff29) sẽ thay đổi các byte và kiểu phụ của 00112233-4455-6677-8899-aabbccddeeff0 dưới dạng tác dụng phụ. Lưu ý rằng điều này xảy ra khi bất kỳ biểu diễn nào thao túng thứ tự byte (``CSHARP_LEGACY`` hoặc ``JAVA_LEGACY``) được sử dụng không chính xác cho các UUID khứ hồi được viết bằng ``STANDARD``. Khi tình thế đảo ngược - tôi. e. khi tài liệu gốc được viết bằng cách sử dụng ``CSHARP_LEGACY`` hoặc ``Java_LEGACY`` và sau đó chuyển đổi vòng lặp bằng cách sử dụng ``STANDARD`` - chỉ. tầng lớp. `~bson. nhị phân. Loại phụ nhị phân` được thay đổi Ghi chú Bắt đầu từ PyMongo 4. 0, những vấn đề này sẽ được giải quyết khi biểu diễn 00112233-4455-6677-8899-aabbccddeeff29 sẽ giải mã các trường kiểu con Nhị phân 3 thành các đối tượng kiểu con 3 00112233-4455-6677-8899-aabbccddeeff0 (thay vì 00112233-4455-6677-8899-aabbccddeeff3) và mỗi biểu diễn 00112233-4455-6677-8899-aabbccddeeff1 sẽ giải mã các trường kiểu con nhị phân 4 thành 00112233-4455-6677-8899-aabbccddeeff0 đối tượng của kiểu con 4 (thay vì Cấu hình một Đại diện UUID¶Người dùng có thể giải quyết các sự cố được mô tả ở trên bằng cách định cấu hình ứng dụng của họ bằng 00112233-4455-6677-8899-aabbccddeeff6 thích hợp. Định cấu hình biểu diễn sẽ sửa đổi hành vi của PyMongo trong khi mã hóa các đối tượng 00112233-4455-6677-8899-aabbccddeeff3 thành BSON và giải mã các trường loại phụ 3 và 4 nhị phân từ BSON Các ứng dụng có thể đặt biểu diễn UUID theo một trong các cách sau
Các biểu diễn UUID được hỗ trợ¶Đại diện UUID Vỡ nợ? Mã hóa 00112233-4455-6677-8899-aabbccddeeff3 thành Giải mã 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4 thành Giải mã 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 3 thành TIÊU CHUẨN Không 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4 00112233-4455-6677-8899-aabbccddeeff3 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 3 KHÔNG XÁC ĐỊNH Có, trong PyMongo>=4 Tăng from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient(uuidRepresentation='standard') collection = client.get_database('uuid_db').get_collection('uuid_coll') # remove all documents from collection collection.delete_many({}) # create a native uuid object uuid_obj = uuid4() # save the native uuid object to MongoDB collection.insert_one({'uuid': uuid_obj}) # retrieve the stored uuid object from MongoDB document = collection.find_one({}) # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj54 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 3 PYTHON_LEGACY Không 00112233-4455-6677-8899-aabbccddeeff0 subtype 3 với thứ tự byte tiêu chuẩn 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4 00112233-4455-6677-8899-aabbccddeeff3 Java_LEGACY Không 00112233-4455-6677-8899-aabbccddeeff0 subtype 3 với thứ tự byte kế thừa của Java 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4 00112233-4455-6677-8899-aabbccddeeff3 CSHARP_LEGACY Không 00112233-4455-6677-8899-aabbccddeeff0 loại phụ 3 với thứ tự byte cũ của C# 00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4 00112233-4455-6677-8899-aabbccddeeff3 Bây giờ chúng tôi trình bày chi tiết hành vi và trường hợp sử dụng cho từng đại diện UUID được hỗ trợ 00112233-4455-6677-8899-aabbccddeeff 46¶Chú ý Bắt đầu từ PyMongo 4. 0, 00112233-4455-6677-8899-aabbccddeeff46 là đại diện UUID mặc định được sử dụng bởi PyMongo Biểu diễn 00112233-4455-6677-8899-aabbccddeeff46 ngăn chặn việc giải thích sai các byte UUID bằng cách ngừng tự động chuyển đổi các trường UUID trong BSON sang các loại UUID gốc. Thay vào đó, việc giải mã UUID khi sử dụng biểu diễn này sẽ trả về một đối tượng 00112233-4455-6677-8899-aabbccddeeff0. Nếu được yêu cầu, người dùng có thể ép buộc các đối tượng 00112233-4455-6677-8899-aabbccddeeff0 đã giải mã thành UUID gốc bằng phương pháp document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj01 và chỉ định định dạng biểu diễn phù hợp. Ví dụ sau đây cho thấy điều này có thể trông như thế nào đối với UUID được lưu trữ bởi trình điều khiển C# document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj4 Các đối tượng gốc 00112233-4455-6677-8899-aabbccddeeff3 không thể được mã hóa trực tiếp thành 00112233-4455-6677-8899-aabbccddeeff0 khi biểu diễn UUID là 00112233-4455-6677-8899-aabbccddeeff46 và cố gắng làm như vậy sẽ dẫn đến một ngoại lệ document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj5 Thay vào đó, các ứng dụng sử dụng 00112233-4455-6677-8899-aabbccddeeff46 phải ép buộc rõ ràng một UUID gốc bằng phương thức document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj06 document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj6 00112233-4455-6677-8899-aabbccddeeff 29¶Chú ý Biểu diễn UUID này nên được sử dụng bởi các ứng dụng mới hoặc ứng dụng mã hóa và/hoặc giải mã UUID trong MongoDB lần đầu tiên Biểu diễn 00112233-4455-6677-8899-aabbccddeeff29 cho phép khả năng tương thích đa ngôn ngữ bằng cách đảm bảo thứ tự byte giống nhau khi mã hóa UUID từ tất cả các trình điều khiển. UUID được viết bởi một trình điều khiển với đại diện này được định cấu hình sẽ được xử lý chính xác bởi mọi trình điều khiển khác miễn là nó cũng được định cấu hình với đại diện 00112233-4455-6677-8899-aabbccddeeff29 00112233-4455-6677-8899-aabbccddeeff29 mã hóa các đối tượng 00112233-4455-6677-8899-aabbccddeeff3 gốc thành các đối tượng loại 4 phụ của 00112233-4455-6677-8899-aabbccddeeff0 00112233-4455-6677-8899-aabbccddeeff 30¶Chú ý Biểu diễn uuid này nên được sử dụng khi đọc các UUID được tạo bởi các ứng dụng hiện có sử dụng trình điều khiển Python nhưng không đặt biểu diễn UUID một cách rõ ràng Chú ý 00112233-4455-6677-8899-aabbccddeeff30 là đại diện uuid mặc định trong PyMongo 3 Biểu diễn 00112233-4455-6677-8899-aabbccddeeff30 tương ứng với biểu diễn cũ của UUID được sử dụng bởi PyMongo. Đại diện này phù hợp với RFC 4122 Mục 4. 1. 2 Ví dụ sau minh họa việc sử dụng biểu diễn này document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj7 00112233-4455-6677-8899-aabbccddeeff30 mã hóa các đối tượng 00112233-4455-6677-8899-aabbccddeeff3 gốc thành các đối tượng loại phụ 3 của 00112233-4455-6677-8899-aabbccddeeff0, giữ nguyên thứ tự byte giống như document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj19 document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj8 00112233-4455-6677-8899-aabbccddeeff 33¶Chú ý Biểu diễn UUID này nên được sử dụng khi đọc các UUID được ghi vào MongoDB bởi các ứng dụng kế thừa (i. e. các ứng dụng không sử dụng biểu diễn 00112233-4455-6677-8899-aabbccddeeff29) bằng trình điều khiển Java Biểu diễn 00112233-4455-6677-8899-aabbccddeeff33 tương ứng với biểu diễn cũ của UUID được sử dụng bởi Trình điều khiển Java MongoDB Ghi chú Biểu diễn 00112233-4455-6677-8899-aabbccddeeff33 đảo ngược thứ tự của byte 0-7 và byte 8-15 Ví dụ: hãy xem xét cùng một UUID được mô tả trong Xử lý dữ liệu UUID cũ . Giả sử rằng một ứng dụng đã sử dụng trình điều khiển Java mà không có biểu diễn UUID được chỉ định rõ ràng để chèn ví dụ UUID document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj24 vào MongoDB. Nếu chúng tôi cố gắng đọc giá trị này bằng cách sử dụng 00112233-4455-6677-8899-aabbccddeeff30, chúng tôi sẽ nhận được một UUID hoàn toàn khác. document = collection.find({'uuid': uuid_obj}) assert document['uuid'] == uuid_obj9 Tuy nhiên, nếu chúng tôi đặt biểu diễn rõ ràng thành 00112233-4455-6677-8899-aabbccddeeff33, chúng tôi sẽ nhận được kết quả chính xác 00112233-4455-6677-8899-aabbccddeeff0 PyMongo sử dụng biểu diễn UUID được chỉ định để sắp xếp lại các byte BSON và tải chúng một cách chính xác. 00112233-4455-6677-8899-aabbccddeeff24 mã hóa các đối tượng 00112233-4455-6677-8899-aabbccddeeff3 gốc thành các đối tượng loại phụ 3 của 00112233-4455-6677-8899-aabbccddeeff0, đồng thời thực hiện sắp xếp lại byte tương tự như bộ mã hóa UUID sang BSON của trình điều khiển C# kế thừa Chúng tôi có thể giải mã UUID không?Phiên bản UUID được biểu thị bằng chữ số thứ 13 của chuỗi UUID thập lục phân ("M" trong sơ đồ bên dưới). Biến thể được thể hiện bằng chữ số thứ 17 ("N" trong sơ đồ bên dưới). Phiên bản và biến thể được mã hóa trong UUID. Phiên bản dễ giải mã .
Làm cách nào để chuyển đổi UUID thành chuỗi trong Python?Sử dụng hàm str() để chuyển UUID thành Chuỗi trong Python
. Chúng ta có thể sử dụng chức năng này để chuyển đổi UUID thành Chuỗi trong Python. Trong ví dụ trên, chúng ta tạo một đối tượng uuid bằng hàm uuid1().
Làm cách nào để chuyển đổi đối tượng UUID thành chuỗi?Phương thức toString() của lớp UUID trong Java thường được sử dụng để lấy biểu diễn chuỗi của UUID này . Thông số. Phương thức này không nhận bất kỳ tham số nào. Giá trị trả về. Phương thức này trả về một giá trị Chuỗi là biểu diễn chuỗi của UUID này.
UUID có phải là một hex không?UUID dưới dạng chuỗi thập lục phân chữ thường gồm 32 ký tự . UUID dưới dạng số nguyên 128 bit. |