python - MD5/SHA-1等哈希算法能否生成比纯随机数碰撞概率更小的ID?
问题描述
我有一个应用程序,它使用哈希算法(目前是 MD5)在数据库表中生成唯一 ID。哈希是根据一行的某些字段计算的,但没有检查该计算,因为稍后更改这些字段时,该行的 ID 不会更改。
现在我想更改代码以添加一些新功能,同时为 ID 生成一个纯随机数可以大大简化我的工作(这是一个很长的故事来说明为什么在我之前生成该 ID 更容易能够获取散列算法的所有必要字段的内容)
我知道通常编程语言自己的随机生成器会生成伪随机数,但我使用的是 Python 的 random.SystemRandom(),它使用操作系统的密码学级别的“真”随机生成器,所以我认为它应该是相同的碰撞概率比较使用哈希算法生成 ID。
我的理解正确吗?如果不是,为什么?
解决方案
生成 X 个字节的随机数据给出了与在某些 ID 上使用哈希函数完全相同的冲突概率......
假设...
- 您使用散列函数的列本身是唯一的。
- 你没有犯错#1
我建议使用系统的加密随机数提供程序。因为你可能犯了错误。这是一个简单的:
您的系统:连接第 1 列和第 2 列,并对结果进行哈希处理。您可以保证永远不会再对第 1 列和第 2 列的值执行此操作。绝不。
什么时候:
- 第 1 列 = “abc”
- 第 2 列 = “定义”
对比
- 第 1 列 = “ab”
- 第 2 列 = “cdef”
那些将创建相同的哈希函数。
那么你会更信任谁给你随机数据呢?你自己?还是一个操作系统开发团队,包括密码学专家和数十年的研究和经验?:)
使用系统的加密随机函数。
推荐阅读
- flutter - “Google 移动广告 SDK 初始化不正确”
- javascript - chrome.runtime.onmessage.addlistener 收不到消息
- ios - 为什么应用在后台和前台接收时,在 IOS 上收不到 FCM 通知?扑
- elasticsearch - 使用 Kubernetes 的 elasticsearch 数据丢失 - 索引被自动删除和创建
- sql - 知道 SQL Server 中所有数据库表之间的关系类型吗?
- python - WebElement 类型的 Selenium 对象没有 len()
- json - 无法将指标发送到 Splunk HEC
- jenkins - 找出在特定从属或代理中运行的作业
- html - Animate.css 在我的 Vue 3 项目中没有动画
- microsoft-teams - Microsoft Bot Framework REST API - 将包含附件的消息发送到对话后无法检索活动 ID