用于ID生成的网址哈希

时间:2018-08-26 10:48:23

标签: hash id

我想通过散列对象的相对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种解决方案:

  1. 将所有特殊字符替换为某些特殊符号。 专业版:简单,快速。 缺点:ID仍然很长
  2. 使用加密哈希。 专业版:轻松,几乎零碰撞。 骗局:慢吗?。
  3. 使用非加密哈希。 专业版:快速。 骗局:有冲突吗?
  4. 生成UUID并通过url字段而不是id进行查询和/或将url-> uuid保存在某些键值存储中。 专业版:零碰撞。 缺点:速度慢,可能难以正确实施。

我喜欢#3,但是有没有冲突的快速哈希吗?如果没有,那么我可能应该坚持使用#2(使用md5或sha1)。您会选择什么,为什么?

编辑:将“无碰撞”读为“发生碰撞的可能性极低”。

1 个答案:

答案 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个字符长。