生成一个唯一的 ID

我是一名大学生,我们的任务是创建一个搜索引擎。我有困难生成一个唯一的 ID 分配给每个网址时添加到边界。我试图使用 SHA-256哈希算法以及 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;
}
285045 次浏览

为什么不用 导游

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

为什么不直接用 ToString 呢?

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

如果你希望它是基于一个网址,你可以简单地做到以下几点:

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

如果您想隐藏 URL,您可以在 source URL 上使用某种形式的 SHA1,但我不确定这可能实现什么目的。

如果你想使用 sha-256(指南会更快) ,那么你需要这样做

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

当然,它不需要 ascii,它也可以是任何其他类型的哈希算法

这个问题似乎得到了回答,但是为了完整起见,我想添加另一种方法。

您可以使用基于 Twitter 的 雪花 ID 生成器的唯一 ID 号生成器。C # 实现可以找到 给你

var id64Generator = new Id64Generator();


// ...


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

注意,这种方法的一个非常好的特性是可以在独立节点上使用多个生成器(可能对搜索引擎有用)生成实时的、全局唯一的标识符。

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


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


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

为什么我们不能像下面这样做一个唯一的 id。

我们可以使用 DateTime.Now. Ticks 和 Guid.NewGuid () . ToString ()组合在一起生成唯一的 id。

作为日期时间。现在。如果添加了刻度,我们可以在创建惟一 id 的几秒钟内找到 Date 和 Time。

请看密码。

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.

我们甚至可以使用唯一标识符中的刻度,然后检查日期和时间,以备将来参考。

下面是一个类似“ YouTube-video-id”的 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();

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

0.001% 的重复在一亿个。

我们可以这么做

string TransactionID = "BTRF"+DateTime.Now.Ticks.ToString().Substring(0, 10);