2011-11-14 43 views
25

Tôi muốn tạo một GUID ngắn. Có cách nào để tạo một mã ngắn độc đáo như GUID ngắn không? Tôi muốn tạo số theo dõi vé.Có cách nào để tạo mã ngắn độc đáo như GUID ngắn không?

+3

càng ngắn đó là, càng ít độc đáo nó được (lưu ý rằng Guid không thực sự là "duy nhất"). Ngắn thế nào? và nó có thể xuất phát từ một khóa nhận dạng cơ sở dữ liệu không? –

+0

Có lý do nào khiến GUID không hoạt động? –

+0

Làm thế nào về chỉ sử dụng các bộ phận của một guid? –

Trả lời

4

Thật phụ thuộc vào cách sử dụng của bạn.

Ví dụ: nếu bạn đang tạo chúng ở tốc độ dưới 1 giây, bạn chỉ có thể tăng 32 bit int (1/4 kích thước của GUID 128 bit). Điều đó sẽ kéo dài bạn hơn 68 năm với tốc độ 1 mỗi giây.

Nếu bạn sử dụng cách sử dụng của mình, bạn nên làm việc với kích thước tối thiểu mà bạn có thể nhận được. Nó cũng sẽ phụ thuộc nếu bạn muốn có thể tạo chúng ở bất cứ đâu, hoặc nếu chúng sẽ được tạo ra bởi một máy chủ hoặc một phần mềm.

4

Hãy thử Base 36, để nhận số duy nhất, tất cả những gì bạn phải làm là sử dụng số tự động và lưu số đó làm Base36. Tuy nhiên để chúng được ngẫu nhiên, bạn sẽ cần một cái gì đó khác.

Điều tôi sẽ làm là, băm hoặc mã hóa số vé làm mã theo dõi vé. Giống như,

code = Base36(MD5(ticketID+"my secrete")); 

Nếu bạn muốn mã theo dõi duy nhất thì tôi sẽ mã hóa bằng một số phím.

17

Độ dài GUID là 128 bit (16byte), vì vậy nếu bạn muốn tạo GUID ngắn, bạn phải thay đổi mã hóa GUID.

Ví dụ: bạn có thể sử dụng base64 hoặc ASCII85.

/// <summary> 
    /// Creates a GUID which is guaranteed not to equal the empty GUID 
    /// </summary> 
    /// <returns>A string</returns> 
    public static string CreateGuid() 
    { 
     Guid guid = Guid.Empty; 
     while (Guid.Empty == guid) 
     { 
      guid = Guid.NewGuid(); 
     } 

     // Uses base64 encoding the guid.(Or ASCII85 encoded) 
     // But not recommend using Hex, as it is less efficient. 
     return Convert.ToBase64String(guid.ToByteArray()); 
    } 
5

độc đáo trong vòng một năm, rõ ràng 'ngẫu nhiên'

string UniqueID() 
{ 
    var t = DateTime.UtcNow; 
    long dgit = t.Millisecond * 1000000000L + 
       t.DayOfYear  * 1000000L + 
       t.Hour   * 10000L + 
       t.Minute  * 100L + 
       t.Second; 
    return Convert.ToBase64String(BitConverter.GetBytes(dgit).Take(5).ToArray()).TrimEnd('='); 
} 

đây là một với một nhân vật tùy biến thiết lập

string UniqueID(string CharList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ") 
{ 
    var t = DateTime.UtcNow; 
    char[] charArray = CharList.ToCharArray(); 
    var result = new Stack<char>(); 

    var length = charArray.Length; 

    long dgit = 1000000000000L + 
       t.Millisecond * 1000000000L + 
       t.DayOfYear  * 1000000L + 
       t.Hour   * 10000L + 
       t.Minute  * 100L + 
       t.Second; 

    while (dgit != 0) 
    { 
     result.Push(charArray[dgit % length]); 
     dgit /= length; 
    } 
    return new string(result.ToArray()); 
} 
+1

thời gian đang hết ..... –

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