我想通过散列对象的相对URL(如static void Main(string[] args)
{
ThreadService threadService = new ThreadService();
Task.Run(() =>
{
Semaphore semaphore = new Semaphore(2, 2);
for (int i = 0; i < 5; i++)
{
semaphore.WaitOne();
Task t = Task.Run(() => threadService.RunFirstMethod()).ContinueWith(s => semaphore.Release());
}
});
Task.Run(() =>
{
Semaphore semaphore = new Semaphore(2, 2);
for (int i = 0; i < 5; i++)
{
semaphore.WaitOne();
Task t = Task.Run(() => threadService.RunSecondMethod()).ContinueWith(s => semaphore.Release());
}
});
Console.ReadLine();
}
)来创建对象的ID。我不想使用url作为id,因为它可能很长并且可能包含特殊字符。
我可以想象有4种解决方案:
我喜欢#3,但是有没有冲突的快速哈希吗?如果没有,那么我可能应该坚持使用#2(使用md5或sha1)。您会选择什么,为什么?
编辑:将“无碰撞”读为“发生碰撞的可能性极低”。
答案 0 :(得分:1)
取决于您认为“微不足道”的程度以及要散列的项目数量。
如果使用32位哈希码,那么仅70,000个左右的项目之后发生冲突的机率就有50%。使用64位哈希码,大约40亿个项目后发生冲突的可能性为50%。
请参阅我的博客条目https://blog.mischel.com/2017/11/02/birthdays-random-numbers-and-hash-keys/和Birthday problem。
使用64位哈希码,在6.1亿个项目后,您有1%的机会生成重复项。对于您来说,这种可能性“微不足道”吗?
一个不错的64位哈希函数是https://en.wikipedia.org/wiki/Jenkins_hash_function。请注意,它不是加密安全的,但是看起来可以在您的应用程序中使用,并且比MD5或SHA1的计算速度要快得多。
如果要将其转换为ID,只需base64 encode即可。这将是12个字符长。