2012-07-03 41 views
40

Tôi là sinh viên đại học và nhiệm vụ của chúng tôi là tạo một công cụ tìm kiếm. Tôi gặp khó khăn khi tạo một id duy nhất để gán cho mỗi url khi được thêm vào biên giới. Tôi đã thử sử dụng thuật toán băm SHA-256 cũng như Guid. Đây là mã mà tôi đã sử dụng để triển khai guid:Tạo một id duy nhất

public string generateID(string url_add) 
{ 
    long i = 1; 

    foreach (byte b in Guid.NewGuid().ToByteArray()) 
    { 
     i *= ((int)b + 1); 
    } 

    string number = String.Format("{0:d9}", (DateTime.Now.Ticks/10) % 1000000000); 

    return number; 
} 
+1

GUID bị ràng buộc là duy nhất trên toàn cầu (do đó tên), vì vậy tôi không hiểu vấn đề. – CodeCaster

+0

Tôi nghĩ rằng mối quan tâm của ông là ông muốn ID là duy nhất dựa trên URL, do đó, một băm một chiều của URL đến một ID duy nhất. Trong trường hợp này, SHA1 sẽ hoạt động. – Richthofen

+1

Luôn có [object.GetHashCode()] (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx). Mặc dù tôi không nghĩ rằng đó là đảm bảo là duy nhất. – RichardTowers

Trả lời

60

Tại sao không chỉ sử dụng ToString?

public string generateID() 
{ 
    return Guid.NewGuid().ToString("N"); 
} 

Nếu bạn muốn nó được dựa trên URL, bạn chỉ có thể làm như sau:

public string generateID(string sourceUrl) 
{ 
    return string.Format("{0}_{1:N}", sourceUrl, Guid.NewGuid()); 
} 

Nếu bạn muốn ẩn địa chỉ URL, bạn có thể sử dụng một số hình thức SHA1 trên sourceURL, nhưng tôi không chắc những gì có thể đạt được.

+0

Điều này làm việc ... Ban đầu tôi muốn id được dựa trên url nhưng điều này dường như làm việc tốt. Liệu nó có thể tạo ra số lượng lớn các khóa duy nhất không? Vì công cụ tìm kiếm sẽ làm việc với số lượng lớn các url –

+11

Điều này sẽ có thể tạo ra khoảng [5,316,911,983,139,663,491,615,228,241,121,400,000] (http://answers.google.com/answers/threadview/id/553194.html) các giá trị duy nhất. –

+0

Cảm ơn rất nhiều! Thats quá đủ vì như url được lấy từ biên giới họ sau đó được gỡ bỏ –

20

Tại sao không sử dụng GUID?

Guid guid = Guid.NewGuid(); 
string str = guid.ToString(); 
3

Nếu bạn muốn sử dụng sha-256 (guid sẽ nhanh hơn) sau đó bạn sẽ cần phải làm điều gì đó như

SHA256 shaAlgorithm = new SHA256Managed(); 
byte[] shaDigest = shaAlgorithm.ComputeHash(ASCIIEncoding.ASCII.GetBytes(url)); 
return BitConverter.ToString(shaDigest); 

Tất nhiên, nó không phải ascii và nó có thể là bất kỳ loại khác của thuật toán băm cũng như

+2

Tôi muốn tránh ASCII ủng hộ một số mã hóa unicode. Đó là tầm thường để tìm va chạm cho mã của bạn. – CodesInChaos

+0

Tôi biết, đó là bởi vì tôi đang làm việc với một hệ thống di sản tại thời điểm này vì vậy tôi có dây cho ascii :) –

+0

Tôi muốn id là duy nhất dựa trên url. Đó là cách mà tôi nghĩ đến việc tạo ra mã số –

1

Câu hỏi này dường như được trả lời, tuy nhiên để có đầy đủ, tôi sẽ thêm một cách tiếp cận khác.

Bạn có thể sử dụng trình tạo số ID duy nhất dựa trên máy phát id số Snowflake của Twitter. C# thực hiện có thể được tìm thấy here.

var id64Generator = new Id64Generator(); 

// ... 

public string generateID(string sourceUrl) 
{ 
    return string.Format("{0}_{1}", sourceUrl, id64Generator.GenerateId()); 
} 

Lưu ý rằng một trong những tính năng rất hay của phương pháp này có thể tạo ra nhiều thời gian thực, số nhận dạng duy nhất trên toàn cầu.

// node 0 
var id64Generator = new Id64Generator(0); 

// node 1 
var id64Generator = new Id64Generator(1); 

// ... node 10 
var id64Generator = new Id64Generator(10); 
+0

Cảm ơn bạn đã tip! Chính xác những gì tôi đang tìm kiếm. – dotnetguy

+0

Có NuGet với mã tại https://github.com/RobThree/IdGen cũng có các id dựa trên bông tuyết tương tự. Mã codeplex cho FlakeId thuộc sở hữu của bạn? Tôi muốn có được nó để github và làm một nuget nếu đó là ok? – dotnetguy

+0

@dotnetguy, vâng, tôi sở hữu cái đó. Chắc chắn, bạn có thể làm theo với github di chuyển và gói nuget. – Tom

-3

Hãy thử điều này.

string a = DateTime.Now.Month.ToString() + 
      DateTime.Now.Day.ToString() + 
      DateTime.Now.Year.ToString() + 
      DateTime.Now.Hour.ToString() + 
      DateTime.Now.Minute.ToString() + 
      DateTime.Now.Second.ToString() + 
      DateTime.Now.Millisecond.ToString(); 
+4

Không phải là DateTime.Now.ToString ("ddMMyyyyHHmmssfff") có dễ dàng hơn không? Dù sao, các phương pháp như vậy rơi trên quy mô lưu lượng truy cập internet. – dotnetguy

+0

Tôi chỉ làm cho nó dễ hiểu. –

+0

Cách xấu. Chủ đề song song có thể tạo cùng một id. Và có một số phụ thuộc môi trường, như bản địa hóa, thời gian máy chủ cục bộ. –

2

Tại sao chúng tôi không thể tạo id duy nhất như dưới đây.

Chúng tôi có thể sử dụng DateTime.Now.Ticks và Guid.NewGuid(). ToString() để kết hợp với nhau và tạo một id duy nhất.

Khi DateTime.Now.Ticks được thêm vào, chúng ta có thể tìm ra Ngày và Giờ tính bằng giây mà tại đó id duy nhất được tạo.

Vui lòng xem mã.

var ticks = DateTime.Now.Ticks; 
var guid = Guid.NewGuid().ToString(); 
var uniqueSessionId = ticks.ToString() +'-'+ guid; //guid created by combining ticks and guid 

var datetime = new DateTime(ticks);//for checking purpose 
var datetimenow = DateTime.Now; //both these date times are different. 

Chúng tôi thậm chí có thể lấy một phần của bọ ve trong id duy nhất và kiểm tra ngày và giờ sau để tham khảo trong tương lai.

1

Dưới đây là 'ID video-YouTube' như trình tạo id, ví dụ: "UcBKmq2XE5a"

StringBuilder builder = new StringBuilder(); 
Enumerable 
    .Range(65, 26) 
    .Select(e => ((char)e).ToString()) 
    .Concat(Enumerable.Range(97, 26).Select(e => ((char)e).ToString())) 
    .Concat(Enumerable.Range(0, 10).Select(e => e.ToString())) 
    .OrderBy(e => Guid.NewGuid()) 
    .Take(11) 
    .ToList().ForEach(e => builder.Append(e)); 
string id = builder.ToString(); 

Nó tạo id ngẫu nhiên có kích thước 11 ký tự. Bạn có thể tăng/giảm điều đó, chỉ cần thay đổi tham số của phương thức Take.

0,001% số bản sao trong 100 triệu.

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