Encryption 在不发生冲突的情况下构建唯一ID

Encryption 在不发生冲突的情况下构建唯一ID,encryption,encoding,hash,scalability,Encryption,Encoding,Hash,Scalability,我正在玩弄系统设计,一直在阅读url缩写器。我意识到围绕这个主题有很多问题,但有一些关于哈希和哈希+编码顺序的具体问题 输入:https://example.com/owjpojwepofjwpoejfpwjepfojpwejfp/wefoijhwioejfiowef/weoifhwoiehjfiowef 输出:https://example.com/abr4fna 如果通过md5运行此输入,我将得到以下9e91e9c2a7ce0f0d11b475d2abfb8593。显然,这超出了我想要的

我正在玩弄系统设计,一直在阅读url缩写器。我意识到围绕这个主题有很多问题,但有一些关于哈希和哈希+编码顺序的具体问题


输入
https://example.com/owjpojwepofjwpoejfpwjepfojpwejfp/wefoijhwioejfiowef/weoifhwoiehjfiowef

输出
https://example.com/abr4fna


如果通过md5运行此输入,我将得到以下
9e91e9c2a7ce0f0d11b475d2abfb8593
。显然,这超出了我想要的长度,因此我可以将子字符串从(0,7)截断。问题是,在某种程度上,我仍然可能发生冲突,因为md5的前缀不能保证是唯一的,因为在服务中生成的URL数量会增加

如果我以前已经使用过这个ID,我不想检查数据库,因为这会使我正在进行的读取量与我正在进行的写入量成正比。此外,随着我增加进行哈希生成和存储的应用程序服务器的数量,可能会出现并发问题

我看到有人提到使用base64编码输出散列,但这在散列之后增加了什么值?是因为我将唯一组合的数量增加了64^n,其中n是我的散列的长度,而md5只有36^n

谢谢。我只是对这次讨论感兴趣

编辑:


据我所知,如果接收系统在解释输出散列中的二进制数据时出现问题,我们纯粹是在进行编码,以确保不会出现传输故障,因此它纯粹是为了显示而使用的。

根据定义,您不能散列一个大域,而期望得到一个较小的域而不会发生冲突。散列用于ul,因为它是单向的,并且需要在计算上不可行的大量尝试才能找到这些冲突。然而,有了7个字符的输出和较大的输入域,即使是偶然的,也会非常容易产生冲突

您当前使用的是7个十六进制数字。每个十六进制数字代表4位。因此,您有28位或2^28个可能值。这大约是2.56亿个可能值。因此,如果您猜测的时间足够长,您很快就会发生冲突。使用base64,您每个字符将有6位(2^6=64,因此得名).这意味着您将位大小增加了7*2=14位,或者大约是原来的1.6万倍,但仍然远远没有达到无冲突的程度


实际上,在接受生日绑定时,为了保证加密的安全性,MD5的16字节输出大约是您希望避免冲突的哈希的绝对最小大小。当然,MD5哈希并不是无缘无故地被弃用,您确实希望使用SHA-256。

为了保证唯一性,请使用加密。唯一输入将提供唯一输出ts,最大为块大小。您可以看到吗?您应该编辑注释,并回答我在该答案中给出的问题,因为它将帮助您确定为您的用例生成唯一ID的最佳方式。例如,是否允许某人在知道唯一ID时访问由唯一ID标识的资源?此外,我应该注意,有是处理多个应用服务器可伸缩性的方法,例如为每个服务器分配一个唯一代码,它可以使用该代码生成唯一ID,而无需进一步联系其他服务器或中央数据库。例如Twitter的雪花服务。另请参阅我写的内容。我不想检查database如果我以前已经使用过此ID,则对我不起作用,因为每次使用缩短的URL时,您都必须从数据库中读取。根据合理的假设,在找到唯一ID之前的预期读取次数可能非常接近1。