生成唯一ID

str*_*per 57 .net c# asp.net uniqueidentifier

我是大学生,我们的任务是创建一个搜索引擎.当添加到边界时,我很难生成分配给每个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;
}
Run Code Online (Sandbox Code Playgroud)

Jai*_*res 83

为什么不使用ToString?

public string generateID()
{
    return Guid.NewGuid().ToString("N");
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果你想隐藏URL,可以在sourceURL上使用某种形式的SHA1,但我不确定它可能会实现什么.

  • 这将能够生成大约[5,316,911,983,139,663,491,615,228,241,121,400,000](http://answers.google.com/answers/threadview/id/553194.html)唯一值. (14认同)

aba*_*hev 24

为什么不使用GUID

Guid guid = Guid.NewGuid();
string str = guid.ToString();
Run Code Online (Sandbox Code Playgroud)


Ash*_*Ali 14

这是一个像"id-generator"这样的"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();
Run Code Online (Sandbox Code Playgroud)

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

1亿份中0.001%重复.


Jin*_*ida 8

为什么我们不能创建一个唯一的 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.
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*Tom 7

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

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

var id64Generator = new Id64Generator();

// ...

public string generateID(string sourceUrl)
{
    return string.Format("{0}_{1}", sourceUrl, id64Generator.GenerateId());
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

// ... node 10
var id64Generator = new Id64Generator(10);
Run Code Online (Sandbox Code Playgroud)


daz*_*ler 6

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

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

当然,它不必是ascii,也可以是任何其他类型的散列算法

  • 我会避免使用 ASCII 以支持某些 unicode 编码。根据您的代码查找冲突是微不足道的。 (2认同)