Có nên cung cấp uuid
Đôi khi khách hàng có thể đã yêu cầu UUID tùy chỉnh, họ sẽ chỉ định một số UUID: kênh dữ liệu Bluetooth, kênh dữ liệu nối tiếp, cài đặt tham số mô-đun, v.v., UUID được sử dụng cho tham số tự xác định và kênh dữ liệu cụ thể.
UUID (Viết tắt của Universally Unique Identifier), còn được gọi là GUID (Globally Unique Identifier) là một giá trị duy nhất dài 128 bit. Một chuỗi UUID chuẩn sử dụng chữ số hex (octet): Show 0710a5ca-f57e-11e9-802a-5aa538984bd8 Mục đích của UUID sinh ra là bởi vì:Dữ liệu lớn, kiểu khóa chính auto imcrement cần nhiều byte để lưu hơn. Và khóa chính kiểu này không phù hợp khi mà hệ thống có nhiều server, nhiều client cùng lúc truy cập trên toàn thế giới. Bạn đang xem: Uuid là gì Bạn đang xem: Uuid là gì Bởi vậy UUID ra đời nhằm khắc phục những yếu điểm trên. Vậy nếu bạn đủ sức xây dựng một hệ thống với nhiều server, phục vụ hàng tỉ tỉ user hoặc chỉ đơn giản là không muốn để lộ id ra ngoài, hãy nghĩ tới UUID. Trong bài này, chúng ta sẽ cùng tìm hiểu về UUID trong Java, thông qua class UUID. 2. Cấu trúc chuỗi UUIDChúng ta cùng xem ví dụ về chuỗi UUID: 123e4567-e89b-42d3-a456-556642440000xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxxA đại diện cho biến thể (variant) xác định bố cục (layout) của UUID. Tất cả các bit khác trong UUID phụ thuộc vào setting của các bit trong trường biến thể (variant field). Biến thể được xác định bởi 3 bit quan trọng nhất của A: MSB1 MSB2 MSB3 0 X X reserved (0) 1 0 X current variant (2) 1 1 0 reserved for Microsoft (6) 1 1 1 reserved for future (7)Giá trị của A trong UUID là "a ". Tương đương nhị phân của "a" (=10xx) hiển thị biến thể là 2.B đại diện cho phiên bản (version). Phiên bản trong UUID (giá trị của B) là 4. Java cung cấp các phương thức để lấy ra variant (biến thể) và version (phiên bản) của UUID như sau: Java có cung cấp một implementation cho v3 và v4, nhưng cũng cung cấp một constructor để giúp người dùng tạo bất kỳ loại UUID nào: UUID uuid = new UUID(long mostSigBits, long leastSigBits); Version 3 & 5Các UUID được tạo bằng cách sử dụng hàm băm của namespace và name. Các định danh namespace là các UUID giống như Domain Name System (DNS), Object Identifiers (OIDs), URLs,...UUID = hash(NAMESPACE_IDENTIFIER + NAME)Sự khác biệt duy nhất giữa UUIDv3 và UUIDv5 là Thuật toán băm (Hashing Algorithm) - v3 sử dụng MD5 (128 bit) trong khi v5 sử dụng SHA-1 (160 bit).Nói một cách đơn giản, chúng ta cắt bớt kết quả băm thành 128 bit và sau đó thay thế 4 bit cho version (phiên bản) và 2 bit cho variant (biến thể). Và đây là cách tạo UUID loại 3 trong java: String source = namespace + name;byte bytes = source.getBytes("UTF-8");UUID uuid = UUID.nameUUIDFromBytes(bytes);Java không cung cấp implementation cho UUID loại 5. Version 4Implementation của UUID v4 trong Java sử dụng các số ngẫu nhiên. Class được java implement là SecureRandom. Nó sử dụng một giá trị không thể đoán trước để tạo ra các số ngẫu nhiên nhằm giảm tỷ lệ trùng.Để sinh chuỗi UUID v4, bạn sử dụng: UUID uuid = UUID.randomUUID();Bạn có thể sinh unique key sử dụng ‘SHA-256" và UUID như sau: MessageDigest salt = MessageDigest.getInstance("SHA-256");salt.update(UUID.randomUUID().toString().getBytes("UTF-8"));String digest = bytesToHex(salt.digest()); 3. Kết luậnVì cả hai hàm băm MD5 và SHA1 đều bị hỏng, nên tốt nhất khuyện bạn sử dụng v5. Nếu bạn chỉ cần tạo UUID đơn giản, loại 4 có thể đáp ứng tốt cho ứng dụng của bạn. Bài viết này sẽ giới thiệu bạn về MySQL UUID, và hướng dẫn sử dụng nó như là primary key (PK), và trình bày về pros và cons trong việc sử dụng nó như primary key. Giới thiệu MySQL UUIDĐịnh danh duy nhất - Universally Unique IDentifier (UUID) được định nghĩa dựa trên RFC 4122, “a Universally Unique Identifier (UUID) URN Namespace). UUDI là số duy nhất trên toàn cầu về mặt không gian và thời gian. 2 UUID là khác biệt nhau ngay cả khi được tạo ra từ 2 máy chủ riêng biệt. Trong MySQL, UUID là 1 số dài 128-bit được biểu diễn dưới dạng chuỗi utf8 gồm 5 số thập lục phân theo định dạng sau:
Để tạo ra giá trị UUID, bạn sử dụng hàm
Hàm Ví dụ:
MySQL UUID vs. Auto-Increment INT như primary keyProsMột số ưu điểm của UUID:
ConsMột số nhược điểm của UUID:
MySQL UUID solutionTrong MySQL, bạn có thể lưu UUID định dạng BINARY và hiển thị ra dạng VARCHAR bằng một số các hàm sau:
Hàm
Hàm
Các UUID sau là hợp lệ trong MySQL:
Ví dụ MySQL UUIDVí dụ sau sử dụng UUID làm primary key. Trước tiên tạo 1 bảng mới tên
Thêm mới UUID vào cột
Khi truy xuất dữ liệu, sử dụng hàm
Như vậy là ngoài cách tạo primary key bằng kiểu INT hay BIGINT, các bạn có thể sử dụng UUID để làm PRIMARY KEY tùy vào mục đích sử dụng dựa vào ưu điểm hay nhược điểm của nó. |