SHA256 哈希的前 8-12 个字符有多独特?

Fir*_*.io 9 url hash sha256 hash-collision

以这个哈希为例:

ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
Run Code Online (Sandbox Code Playgroud)

对于我的目的来说太长了,所以我打算使用其中的一小部分,例如:

ba7816bf8f01
ba7816bf
Run Code Online (Sandbox Code Playgroud)

或者类似的。我的预期用例:

  • 网站上的视频库,以缩略图表示。它们的顺序是随机的。
  • 他们在灯箱里玩耍。他们没有唯一的 ID,只有他们的 URL 是唯一的。
  • 当灯箱打开时,我使用JS History API在页面 URL 的末尾添加一些内容。

//example.com/video-gallery/灯箱/ ba7816bf8f01

  • 后缀需要短小精悍,绝对不是网址。
  • 人们共享 URL。
  • 服务器可以理解与 /video-gallery 相关的 lightbox/ba7816bf8f01。
  • 访问URL,灯箱需要找到后缀属于哪个视频并播放。

我以为我会将视频的 URL SHA256,使用前几个字符作为临时 ID。我应该从生成的哈希中使用多少个字符,以大大减少冲突的机会?

我从URLs and Hashing by Google 中得到了这个想法。

Ry-*_*Ry- 6

关于生日攻击的维基百科页面有一个表格,其中包含您需要的条目数量,以产生与作为随机标识符的特定数量的位发生碰撞的一定机会。例如,如果您希望发生碰撞的几率为百万分之一,并希望存储一百万个文档,那么您将需要少于 64 位(16 个十六进制字符)。

与十六进制相比,Base64也是将更多位放入相同长度的字符串的好方法,取 1? 每字节字符而不是 2。

  • @Firsh:哈希。在 PHP 中,这看起来像 `base64_encode(hash('sha256', $input, true))` – 注意 `true` 给出原始而不是十六进制编码的散列输出。 (2认同)