生成唯一ID

时间:2012-07-03 14:33:15

标签: c# asp.net .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;
}

7 个答案:

答案 0 :(得分:81)

为什么不使用ToString?

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

如果您希望它基于网址,您只需执行以下操作:

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

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

答案 1 :(得分:23)

为什么不使用GUID

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

答案 2 :(得分:10)

以下是像“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();

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

1亿分中0.001%重复。

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:3)

为什么我们不能在下面创建一个唯一的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.

我们甚至可以在唯一身份证中使用刻度线的一部分,并稍后检查日期和时间以供将来参考。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

我们可以做这样的事情

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