Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成唯一的id_C#_Asp.net_.net_Uniqueidentifier - Fatal编程技术网

C# 生成唯一的id

C# 生成唯一的id,c#,asp.net,.net,uniqueidentifier,C#,Asp.net,.net,Uniqueidentifier,我是一名大学生,我们的任务是创建一个搜索引擎。当添加到frontier时,我很难生成一个唯一的id来分配给每个url。我尝试使用SHA-256哈希算法和Guid。以下是我用来实现guid的代码: public string generateID(string url_add) { long i = 1; foreach (byte b in Guid.NewGuid().ToByteArray()) { i *= ((int)b + 1); }

我是一名大学生,我们的任务是创建一个搜索引擎。当添加到frontier时,我很难生成一个唯一的id来分配给每个url。我尝试使用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;
}
为什么不使用


为什么不直接使用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,但我不确定这会实现什么效果。

如果您想使用sha-256(guid会更快),则需要执行以下操作

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

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

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

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

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

// 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

添加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.

我们甚至可以在unique id中使用记号部分,稍后检查日期和时间以供将来参考。

这里有一个类似于“YouTube视频id”的id生成器,例如“UcBKmq2XE5a”

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


1亿中有0.001%的副本。

我们可以这样做

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


GUID必须是全局唯一的(因此它的名称),所以我不理解这个问题。我认为他关心的是,他希望基于URL的ID是唯一的,因此URL到唯一ID的单向散列。在这种情况下,SHA1可以工作。总是存在。虽然我不认为这保证是唯一的。@RichardTowers这几乎保证不是唯一的答案:
returnURL\u add我会避免使用ASCII,而使用一些unicode编码。在给定代码的情况下发现冲突是很简单的。我知道,这是因为我目前使用的是一个遗留系统,所以我使用ascii:)我希望id基于url是唯一的。这就是我想到的生成代码的方法这是有效的。。。我最初希望id基于url,但这似乎很好。它能生成大量的唯一密钥吗?因为搜索引擎将与大量URL一起工作,这将能够产生大约唯一的值。非常感谢!这就足够了,因为当url从边疆检索时,它们就会被删除。谢谢!基于url也可以工作!我认为,基于url将使它更独特,冲突的可能性更小!非常感谢!!!哦,不!再次测试了基于url的代码,但它不起作用。。。但是第一个非常好用!谢谢你的提示!这正是我要找的。有一个NuGet,它的代码也有类似的基于雪花的ID。FlakeId的codeplex代码是否归您所有?如果可以的话,我想把它拿到github做一个裸体测试?@dotnetguy,是的,我拥有这个。当然,您可以使用github迁移和nuget软件包。您认为可以将此作为电子商务的订单号吗?两个订单是否有可能使用该方法获得相同的id?考虑到每天可能有1K或10K订单?我不建议在您的情况下使用上述方法。最好的选择是使用Guid。另外,在我的例子中,如果我重新措辞,我需要与您的解决方案完全相同的东西(一个大约8个字符的字母数字字符串),以便在电子商务应用程序中将其用作订单号,我只是将您的解决方案添加到我的项目中+根据DB检查重复项,如果是,则生成一个新的。CorrelationIdGenerator类适合我的场景吗?
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.
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();
string TransactionID = "BTRF"+DateTime.Now.Ticks.ToString().Substring(0, 10);