我正在实现一些使用可变长度的 id 的程序。这些 id 标识一条消息并发送到将执行某些操作(与问题无关)的代理。但是,代理中此 ID 的最大长度为 24 个字节。我正在考虑使用 SHA 对 id 进行散列(在发送到代理之前)并删除一些字节,直到它仅获得 24 个字节。
但是,我想知道这会增加多少碰撞。所以这是我到目前为止得到的:
我发现对于“完美”的哈希,我们有一个公式p^2 / 2^n+1
来描述冲突的概率,p
消息的数量在哪里,消息n
的大小在哪里。这是我的问题开始的地方。我假设从最终哈希中删除一些字节,函数仍然保持“完美”,我仍然可以使用相同的公式。所以假设我得到:
5160^2 / 2^192 + 1 = 2.12x10^-51
其中 5160 是消息的选择数,192 基本上是 24 字节中的位数。
我的问题:
我的假设正确吗?通过删除一些字节,哈希是否保持“完美”。
如果是这样并且由于概率非常小,我应该删除哪些字节?最重要还是最不重要?这真的很重要吗?
PS:欢迎任何其他达到相同结果的建议。谢谢。