Cần xử lý> 1000 nhưng <10000 bản ghi mới mỗi ngày
Không thể sử dụng GUID / UUID, số tự động tăng dần, v.v.
Tốt nhất nên dài 5 hoặc 6 ký tự, tất nhiên có thể là alpha
Muốn sử dụng lại các bí danh nổi tiếng hiện có, nếu có
Có gì ngoài đó không?
Cần xử lý> 1000 nhưng <10000 bản ghi mới mỗi ngày
Không thể sử dụng GUID / UUID, số tự động tăng dần, v.v.
Tốt nhất nên dài 5 hoặc 6 ký tự, tất nhiên có thể là alpha
Muốn sử dụng lại các bí danh nổi tiếng hiện có, nếu có
Có gì ngoài đó không?
Câu trả lời:
Cơ sở 62 được sử dụng bởi tinyurl và bit.ly cho các URL viết tắt. Đó là một phương pháp dễ hiểu để tạo ID "duy nhất", con người có thể đọc được. Tất nhiên bạn sẽ phải lưu trữ các ID đã tạo và kiểm tra các bản sao khi tạo để đảm bảo tính duy nhất. (Xem mã ở cuối câu trả lời)
Chỉ số tính duy nhất cơ sở 62
5 ký tự trong cơ số 62 sẽ cung cấp cho bạn 62 ^ 5 ID duy nhất = 916.132.832 (~ 1 tỷ) Với 10k ID mỗi ngày, bạn sẽ ổn với 91k + ngày
6 ký tự trong cơ số 62 sẽ cung cấp cho bạn 62 ^ 6 ID duy nhất = 56.800.235.584 (hơn 56 tỷ) Với 10k ID mỗi ngày, bạn sẽ ổn trong hơn 5 triệu ngày
Số liệu về tính duy nhất cơ sở 36
6 ký tự sẽ cung cấp cho bạn 36 ^ 6 ID duy nhất = 2.176.782.336 (hơn 2 tỷ)
7 ký tự sẽ cung cấp cho bạn 36 ^ 7 ID duy nhất = 78.364.164.096 (hơn 78 tỷ)
Mã:
public void TestRandomIdGenerator()
{
// create five IDs of six, base 62 characters
for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase62(6));
// create five IDs of eight base 36 characters
for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase36(8));
}
public static class RandomIdGenerator
{
private static char[] _base62chars =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
.ToCharArray();
private static Random _random = new Random();
public static string GetBase62(int length)
{
var sb = new StringBuilder(length);
for (int i=0; i<length; i++)
sb.Append(_base62chars[_random.Next(62)]);
return sb.ToString();
}
public static string GetBase36(int length)
{
var sb = new StringBuilder(length);
for (int i=0; i<length; i++)
sb.Append(_base62chars[_random.Next(36)]);
return sb.ToString();
}
}
Đầu ra:
z5KyMg wd4SUp uSzQtH UPrGAT UIf2IS QCF9GNM5 0UV3TFSS 3MG91VKP 7NTRF10T AJK3AJU7
Tôi đề xuất http://hashids.org/ chuyển đổi bất kỳ số nào (ví dụ: DB ID) thành một chuỗi (sử dụng muối).
Nó cho phép giải mã chuỗi này trở lại số. Vì vậy, bạn không cần phải lưu trữ nó trong cơ sở dữ liệu.
Có libs cho JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Swift, Clojure, Objective-C, C, C ++ 11, Go, Erlang, Lua, Elixir, ColdFusion, Groovy, Kotlin, Nim, VBA, CoffeeScript và cho Node.js & .NET.
Tôi đã có những yêu cầu tương tự như OP. Tôi đã xem xét các thư viện có sẵn nhưng hầu hết chúng đều dựa trên sự ngẫu nhiên và tôi không muốn điều đó. Tôi thực sự không thể tìm thấy bất kỳ thứ gì không dựa trên ngẫu nhiên và vẫn còn rất ngắn ... Vì vậy, tôi đã kết thúc việc tự làm dựa trên kỹ thuật mà Flickr sử dụng , nhưng được sửa đổi để yêu cầu ít phối hợp hơn và cho phép thời gian ngoại tuyến lâu hơn.
Nói ngắn gọn:
Nhược điểm:
Ưu điểm
Tôi đã xuất bản cả thư viện Javascript cho phía máy khách, cũng như triển khai máy chủ Java EE. Việc triển khai máy chủ bằng các ngôn ngữ khác cũng phải dễ dàng.
Dưới đây là các dự án:
suid - Dịch vụ được phân phối-ID duy nhất ngắn và hấp dẫn
suid-server-java - Triển khai suid-server cho ngăn xếp công nghệ Java EE.
Cả hai thư viện đều có sẵn theo giấy phép nguồn mở Creative Commons tự do. Hy vọng điều này có thể giúp những người khác đang tìm kiếm các ID ngắn duy nhất.
suid
không?
Tôi đã sử dụng cơ sở 36 khi giải quyết vấn đề này cho một ứng dụng mà tôi đang phát triển vài năm trước. Tôi cần tạo một số duy nhất hợp lý có thể đọc được của con người (dù sao thì trong năm dương lịch hiện tại). Tôi đã chọn sử dụng thời gian tính bằng mili giây từ nửa đêm ngày 1 tháng 1 của năm hiện tại (vì vậy mỗi năm, dấu thời gian có thể trùng lặp) và chuyển nó thành số cơ sở 36. Nếu hệ thống đang được phát triển gặp sự cố nghiêm trọng, nó sẽ tạo ra số cơ sở 36 (7 ký tự) được hiển thị cho người dùng cuối thông qua giao diện web, người này sau đó có thể chuyển tiếp sự cố gặp phải (và số) cho người hỗ trợ kỹ thuật (người sau đó có thể sử dụng nó để tìm điểm trong nhật ký nơi ngăn xếp bắt đầu). Một số như 56af42g7người dùng đọc và chuyển tiếp dễ dàng hơn vô cùng so với dấu thời gian như 2016-01-21T15: 34: 29.933-08: 00 hoặc UUID ngẫu nhiên như 5f0d3e0c-da96-11e5-b5d2-0a1d41d68578 .
Tôi thực sự thích sự đơn giản của việc chỉ mã hóa một GUID bằng định dạng Base64 và cắt bớt dấu == để có được một chuỗi gồm 22 ký tự (cần một dòng mã và bạn luôn có thể chuyển đổi nó trở lại GUID). Đáng buồn thay, nó đôi khi bao gồm các ký tự + và /. OK cho cơ sở dữ liệu, không tốt cho URL, nhưng nó đã giúp tôi đánh giá cao các câu trả lời khác :-)
Từ https://www.codeproject.com/Tips/1236704/Reducing-the-string-Length-of-a-Guid của Christiaan van Bergen
Chúng tôi nhận thấy rằng việc chuyển đổi Guid (16 byte) thành biểu diễn ASCII bằng cách sử dụng Base64 dẫn đến một messageID duy nhất và có thể sử dụng được chỉ gồm 22 ký tự.
var newGuid = Guid.NewGuid();
var messageID = Convert.ToBase64String(newGuid.ToByteArray());
var message22chars = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0,22);
Ví dụ: Hướng dẫn 'e6248889-2a12-405a-b06d-9695b82c0a9c' (độ dài chuỗi: 36) sẽ nhận được biểu diễn Base64: 'iYgk5hIqWkCwbZaVuCwKnA ==' (độ dài chuỗi: 24)
Biểu diễn Base64 kết thúc bằng các ký tự '=='. Bạn chỉ có thể cắt bớt những thứ này mà không ảnh hưởng gì đến tính độc đáo. Để lại cho bạn một mã định danh chỉ dài 22 ký tự.