2009-08-19 30 views
6

Tôi cần tạo id bản ghi duy nhất cho chuỗi duy nhất đã cho.cắt giảm uuid hơn nữa để tạo chuỗi ngắn

Tôi đã thử sử dụng định dạng uuid có vẻ tốt.

Nhưng chúng tôi cảm thấy điều đó kéo dài.

vì vậy chúng tôi cần phải cắt chuỗi uuid 9f218a38-12cd-5942-b877-80adc0589315 thành nhỏ hơn. Bằng cách xóa '-', chúng tôi có thể lưu 4 ký tự. Phần an toàn nhất để xóa khỏi uuid là gì? Chúng tôi không cần id duy nhất phổ biến nhưng chúng tôi muốn sử dụng uuid như một nguồn nhưng cắt giảm chuỗi.

Chúng tôi cần id duy nhất cụ thể cho trang web/cơ sở dữ liệu (dịch vụ dữ liệu SQL Server/ADO.NET).

Bất kỳ ý tưởng hoặc mẫu từ ngôn ngữ nào là tốt

Cảm ơn trước

Trả lời

8

Tại sao không thay vì chỉ chuyển nó sang một cơ sở 64 chuỗi? Bạn có thể cắt giảm xuống 22 ký tự theo cách đó.

Storing UUID as base64 String

3

Nếu bạn đang sử dụng MS-SQL bạn nên có lẽ chỉ cần sử dụng các kiểu dữ liệu uniqueindentifier, nó là cả nhỏ gọn (16 byte) và từ động cơ SQL biết về nó nó có thể tối ưu hóa các chỉ mục và truy vấn sử dụng nó.

+1

UUID cũng là 16 byte, do đó, điều này không làm cho nó nhỏ hơn cả. –

+0

Glenn, uniqueindentifier == UUID, nhưng OP chắc chắn đang nói về việc lưu trữ nó như một chuỗi. –

0

UUID có 128 bit. Bạn đã xem xét làm một CRC của nó? Điều đó có thể làm cho nó xuống đến 16 hoặc 32 bit một cách dễ dàng, và sẽ sử dụng tất cả các thông tin ban đầu. Nếu CRC không đủ tốt, bạn luôn có thể sử dụng vài byte đầu tiên của một băm thích hợp (ví dụ: SHA256).

Nếu bạn thực sự muốn chỉ cắt giảm UUID, định dạng của nó được mô tả trong RFC 4122. Bạn sẽ có thể tìm ra những phần mà triển khai của bạn không cần từ đó.

+1

CRC sẽ không độc đáo chút nào. –

+1

Phụ thuộc vào mức độ độc đáo mà anh cần. Đó là lý do tại sao tôi đề nghị cả CRC và một giải pháp thay thế. –

+1

Thật không may, bạn không thể cắt giảm các bit thô của UUID mà không lấy đi trạng thái của nó như một UUID. Điều này là do cần phải có 128 bit ngẫu nhiên để được coi là UUID và đủ khả năng cắt giảm khả năng va chạm gần bằng không. –

2

UUID cung cấp (gần) 128 bit tính duy nhất. Bạn có thể rút ngắn nó thành 16 byte nhị phân hoặc 22 ký tự được mã hóa base64. Tôi sẽ không khuyên bạn nên loại bỏ bất kỳ phần nào của một UUID, nếu không, nó chỉ mất ý nghĩa của nó. UUID được thiết kế sao cho tất cả 128 bit đều có ý nghĩa. Nếu bạn muốn ít hơn thế, bạn nên sử dụng một số lược đồ khác.

Ví dụ: nếu bạn có thể đảm bảo rằng chỉ có UUID phiên bản 4 được sử dụng, thì bạn có thể chỉ sử dụng 32 bit đầu tiên hoặc chỉ 32 bit cuối cùng. Bạn mất tính độc đáo, nhưng bạn có số lượng khá ngẫu nhiên. Chỉ cần tránh các bit được sửa (phiên bản và biến thể).

Nhưng nếu bạn không thể đảm bảo điều đó, bạn sẽ có vấn đề thực sự. Đối với UUID phiên bản 1, các bit đầu tiên sẽ không phải là duy nhất cho UUID được tạo trong cùng một ngày và các bit cuối cùng sẽ không phải là duy nhất cho UUID được tạo trong cùng một hệ thống. Ngay cả khi bạn CRC UUID, nó không được đảm bảo rằng bạn sẽ có 16 hoặc 32 bit của tính độc đáo.

Trong trường hợp này, chỉ cần sử dụng một số lược đồ khác. Tạo một số ngẫu nhiên 32 bit bằng cách sử dụng trình tạo số ngẫu nhiên của hệ thống và sử dụng nó làm ID duy nhất của bạn. Đừng dựa vào UUID nếu bạn định loại bỏ chiều dài của nó.

2

UUID là 128 bit hoặc 16 byte. Không có mã hóa, bạn có thể nhận được nó dưới 16 byte. UUID thường được viết bằng hệ thập lục phân, biến chúng thành chuỗi 32 byte có thể đọc được.Với mã hóa khác, bạn sẽ có kết quả khác nhau:

  1. cơ sở-64 biến 3 8-bit byte vào 4 ký tự 6-bit, do đó 16 byte dữ liệu trở nên 22 ký tự dài
  2. cơ sở-85 tròn 4 tuổi 8- bit byte thành 5 ký tự 6,4 bit, do đó 16 byte dữ liệu trở thành 20 ký tự dài

Tất cả phụ thuộc vào nếu bạn muốn chuỗi có thể đọc được và cách mã hóa chuẩn/phổ biến bạn muốn sử dụng.

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