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