Nếu bạn lưu trữ bản ghi trong cơ sở dữ liệu, bạn thực sự nên xem xét các khả năng có sẵn ở đó để tạo khóa thay thế duy nhất. Trong SQLServer, đây sẽ là trường IDENTITY và trong Oracle, nó sẽ là trường sử dụng SEQUENCE để tạo một giá trị mới.
Nếu có một lý do thuyết phục tại sao bạn không thể sử dụng cơ sở dữ liệu của bạn để tạo ra một chìa khóa duy nhất, bạn nên nhìn vào một cái gì đó giống như một Guid
- trong đó có một xác suất cao hơn mucher hơn ngày thời gian thao tác để tạo ra một giá trị duy nhất . Các hướng dẫn có thể được chuyển đổi một cách trivially thành các chuỗi, vì vậy mã định danh của bạn sẽ là một chuỗi trong trường hợp này.
Những gì bạn đang làm với băm không phải là ý tưởng hay. - không có gì mà người bảo đảm băm sẽ là duy nhất - và trong nhiều trường hợp họ thực sự va chạm. Các hướng dẫn - không cung cấp sự bảo đảm 100% về tính độc đáo trên các máy nhưng trên một máy duy nhất, chúng phải luôn là duy nhất. Và ngay cả trên các máy móc, cơ hội va chạm của chúng cực kỳ xa. Ngoài ra, việc sử dụng thời gian của máy như một cách để xây dựng giá trị cơ bản là tùy thuộc vào các điều kiện chủng tộc (như những gì Eric mô tả).
Hướng dẫn là giá trị 128 bit, vì vậy bạn không thể đại diện cho chúng là đơn giản int
hoặc long
. Nó sẽ yêu cầu bạn sử dụng chuỗi như ID của bạn, có thể hoặc không thể xảy ra trong trường hợp của bạn, tùy thuộc vào các cân nhắc khác (như bạn có kiểm soát mô hình dữ liệu hay không). Nếu có thể sử dụng chúng, sử dụng một Guid là rất dễ dàng:
string customerId = Guid.NewGuid().ToString(); // fetch new guid and save as string
string orderNumber = Guid.NewGuid().ToString(); // same story here...
Nếu bạn thực sự phải sử dụng một định dạng số, và bạn sẵn sàng từ bỏ một cách dễ dàng nhân rộng ứng dụng của bạn trên nhiều máy chủ, bạn có thể sử dụng một auto-incrementing số toàn cầu để cung cấp khóa duy nhất. Bạn sẽ phải nhân giống số này với giá trị sẵn có tiếp theo (max + 1) từ cơ sở dữ liệu của bạn khi ứng dụng khởi động. Bạn cũng sẽ phải bảo vệ giá trị này khỏi việc sử dụng đồng thời từ nhiều luồng.Tôi sẽ quấn trách nhiệm này trong một lớp học:
class static UniqueIDGenerator
{
// reads Max+1 from DB on startup
private static long m_NextID = InitializeFromDatabase();
public static long GetNextID() { return Interlocked.Increment(ref m_NextID); }
}
EDIT:Trong ngày và tuổi tác, lý do thuyết phục để tạo ID duy nhất trong lớp ứng dụng của bạn hơn là ở cơ sở dữ liệu rất phổ biến . Bạn thực sự nên sử dụng các khả năng mà cơ sở dữ liệu cung cấp.
Về lý thuyết, băm có thể va chạm. –
Chắc chắn nó không thực sự độc đáo bạn đang tìm kiếm, chỉ là số thứ tự tiếp theo ... Tôi đồng ý với những người dân dưới đây nói về việc sử dụng một cột nhận dạng. – Paddy
@Developer Art: Không có lý thuyết gì về nó. Hashes va chạm * mọi lúc *. Chỉ có khoảng bốn tỷ người trong số họ có sẵn, do đó, tất nhiên họ sẽ va chạm. –