生成一个唯一的ID

我是大学的学生,我们的任务是创build一个search引擎。 添加到边界时,我很难生成一个唯一的ID分配给每个url。 我曾尝试使用SHA-256哈希algorithm以及Guid。 这里是我用来实现guid的代码:

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; } 

为什么不使用ToString?

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

如果您希望基于url,则可以简单地执行以下操作:

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

如果你想隐藏URL,你可以在sourceURL上使用某种forms的SHA1,但是我不确定可能会达到什么样的效果。

为什么不使用GUID ?

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

如果你想使用sha-256(guid会更快),那么你需要做类似的事情

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

当然,它不需要ascii,也可以是其他types的哈希algorithm

为什么我们不能如下创build一个唯一的ID。

我们可以使用DateTime.Now.Ticks和Guid.NewGuid()。ToString()来组合一个唯一的ID。

当添加DateTime.Now.Ticks时,我们可以在几秒钟内find创build唯一标识的date和时间。

请参阅代码。

 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. 

我们甚至可以采取独特的编号的部分蜱和日后检查date和时间,以备将来参考。

这个问题似乎已经回答了,不过为了完整起见,我还要再增加一个方法。

您可以使用基于Twitter Snowflake ID生成器的唯一ID号生成器。 C#实现可以在这里find。

 var id64Generator = new Id64Generator(); // ... public string generateID(string sourceUrl) { return string.Format("{0}_{1}", sourceUrl, id64Generator.GenerateId()); } 

请注意,这种方法的一个非常好的特点是可能有多个独立节点上的生成器(可能是一个有用的search引擎)生成实时的,全球唯一的标识符。

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

这是一个“YouTubevideoID”像ID发生器,例如“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(); 

它创build大小为11个字符的随机ID。 您也可以增加/减less,只需更改Take方法的参数即可。

1亿重复0.001%。

尝试这个。

 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();