Tôi đang cố gắng tạo ID duy nhất để sử dụng trong ứng dụng Google App Engine và muốn phản hồi về tính khả thi của cách tiếp cận mà tôi đang nghĩ đến khi sử dụng (câu hỏi ở cuối). Tôi đã đọc khá nhiều câu hỏi về chủ đề này, nhưng tôi không nhớ đã đi qua cách tiếp cận đặc biệt này.Tạo ID ngẫu nhiên nhỏ
Tôi muốn ID trông ngẫu nhiên, ví dụ: băm MD5, nhưng tôi cũng muốn chúng nhỏ. Bốn đến sáu ký tự, dọc theo dòng tinyurl, sẽ là lý tưởng. Các ID sẽ dành cho nội dung do người dùng tạo, trong ngữ cảnh của ứng dụng của tôi, những thứ như câu hỏi kiểm tra mà mọi người sẽ viết. Nó không cần thiết rằng các ID được tìm kiếm ngẫu nhiên (nó là tốt nếu họ trông giống như ID nối tiếp), nhưng cách tiếp cận tôi đang nghĩ đến việc sử dụng cho vay chính nó, do đó, nó không thực sự là một vấn đề.
Những người quen thuộc với Google App Engine sẽ biết rằng ghi vào kho dữ liệu đặc biệt tốn kém và có thể dẫn đến hết thời gian chờ nếu có quá nhiều người trong số họ vào cùng một nhóm tổ chức. Các bộ đếm phân tầng là một cách tiếp cận thường được sử dụng để tránh tranh chấp viết trên một bộ đếm toàn cục đơn lẻ và các giao dịch không thành công đi kèm với nó.
Cùng với việc nhận các ID ngắn và tránh tranh cãi, tôi đang cố gắng tránh nghịch lý sinh nhật. Tôi muốn chuẩn bị cho khả năng có hàng triệu ID, ngay cả khi điều này xảy ra một chút.
Tôi đã nghĩ đến việc sử dụng một bộ đếm sharded dọc theo dòng sau đây:
- Bộ đếm là sharded trên người dùng, do đó có một mảnh cho mỗi người dùng. Mỗi đối tượng truy cập có số đếm riêng cho từng người dùng cụ thể, được tăng lên khi một mục mới được tạo bởi người dùng đó. Số đếm được tăng lên bất kể một mục được tạo thành công hay không.
- Cơ sở của ID là mã băm MD5 của chuỗi sau: "< địa chỉ email người dùng > | < giá trị cập nhật mới nhất >".
- Băm MD5 kết quả sau đó được cắt ngắn, ban đầu thành bốn ký tự.
- Giá trị "chiều dài" toàn cầu duy nhất được duy trì. Bất cứ khi nào các bước trước đó dẫn đến một khóa trùng lặp (một trong những tưởng tượng điều này sẽ xảy ra khá nhanh lúc đầu), giá trị của độ dài sẽ được tăng lên một. Băm MD5 cho ID mới giờ đây sẽ bị cắt ngắn ở các ký tự "độ dài", thay vì bốn ký tự.
- Tôi không muốn để lộ địa chỉ email của người dùng, điều này gợi ý rằng một loại băm nào đó sẽ là một cách hay.
Câu hỏi của tôi là: Tôi có nghĩ rằng điều này phần lớn sẽ tránh viết tranh chấp do các khóa trùng lặp và viết tranh chấp trên trường độ dài có thể không phải là vấn đề, đặc biệt là ở độ dài dài hơn? Bất cứ ai có thể mô tả toán học có liên quan ở đây? Liệu độ dài có tăng nhanh đến gần độ dài của một mã băm MD5, gọi vào câu hỏi giá trị của toàn bộ cách tiếp cận? Nó sẽ được tốt hơn chỉ để đi với đầy đủ (còn) MD5 băm để giữ cho mọi thứ dễ dàng hơn để duy trì? Có cái gì tôi nhìn?
Cảm ơn bạn đã tiếp cận thú vị. Tôi sẽ suy nghĩ và cố gắng hiểu rõ hơn. Một câu hỏi tôi có là bao nhiêu nó sẽ là kết quả trong va chạm (hoặc retries) như số lượng các phím phát triển lớn. Tôi đang cố gắng giữ cho va chạm càng gần bằng không. –
Bạn sẽ chỉ chạy vào va chạm khi các phân vùng lấp đầy. – Dave
Có các tối ưu hóa khác bạn có thể thực hiện với điều này: 1. Memcache danh sách "phân vùng đầy" 2. Nếu bạn sắp nhận được một loạt các id cùng một lúc, bạn có thể lấy một khối n id từ một phân vùng và sau đó tăng truy cập của nó bằng giá trị đó. – Dave