75

我是一名大学生,我们的任务是创建一个搜索引擎。当添加到边界时,我很难生成分配给每个 url 的唯一 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;
}
4

7 回答 7

122

为什么不直接使用 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 上使用某种形式的 SHA1,但我不确定这会实现什么。

于 2012-07-03T14:36:14.317 回答
34

为什么不使用GUID

Guid guid = Guid.NewGuid();
string str = guid.ToString();
于 2012-07-03T14:34:54.967 回答
29

这是一个类似于 id 生成器的“YouTube-video-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% 重复 1 亿。

于 2017-07-07T00:27:43.677 回答
9

为什么我们不能如下创建一个唯一的 id。

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

添加 DateTime.Now.Ticks 后,我们可以找出创建唯一 ID 的日期和时间(以秒为单位)。

请看代码。

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.

我们甚至可以获取唯一 id 中的刻度部分,并在以后检查日期和时间以供将来参考。

于 2017-05-30T07:54:38.173 回答
6

如果您想使用 sha-256(guid 会更快),那么您需要执行类似的操作

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

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

于 2012-07-03T14:45:35.263 回答
4

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

您可以使用基于 Twitter 的Snowflake 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);
于 2015-07-18T09:21:32.223 回答
0

我们可以做这样的事情

string TransactionID = "BTRF"+DateTime.Now.Ticks.ToString().Substring(0, 10);
于 2019-12-02T10:35:12.997 回答