MD5/SHA-1这样的hash算法能不能生成比纯随机数碰撞概率更小的ID?
Can hash algorithm such as MD5/SHA-1 generate an ID with less probability of collision than pure random number?
我有一个应用程序使用散列算法(目前是 MD5)在数据库中生成唯一 ID table。散列是根据行的某些字段计算的,但没有任何检查该计算,因为稍后更改这些字段时,该行的 ID 不会更改。
现在我想更改代码以添加一些新功能,同时为 ID 生成纯随机数可以大大简化我的工作(说来话长,为什么我更容易生成它在我能够获得哈希算法的所有必要字段内容之前的 ID)
我知道通常编程语言自己的随机生成器会生成伪随机数,但我使用的是Python的random.SystemRandom(),它使用操作系统的密码级别'true' 随机生成器,所以我认为与使用哈希算法生成ID相比,它应该是相同的碰撞概率。
我的理解对吗?如果不是,为什么?
生成 X 个字节的随机数据给出的碰撞概率与在某些 ID 上使用哈希函数完全相同...
假设...
- 您使用哈希函数的列本身是唯一的。
- #1 你没有犯错
我建议使用系统的加密随机数提供程序。因为你可能犯了错误。这是一个简单的:
您的系统:连接第 1 列和第 2 列,并对结果进行哈希处理。您可以保证您永远不会再对第 1 列和第 2 列的那些值执行此操作。从来没有。
什么时候:
- 第 1 列 = "abc"
- 第 2 列 = "def"
对
- 第 1 列 = "ab"
- 第 2 列 = "cdef"
那些将创建相同的哈希函数。
那么你更信任谁给你随机数据呢?你自己?还是一个操作系统开发团队,包括密码学专家和数十年的研究和经验? :)
使用系统的加密随机函数。
我有一个应用程序使用散列算法(目前是 MD5)在数据库中生成唯一 ID table。散列是根据行的某些字段计算的,但没有任何检查该计算,因为稍后更改这些字段时,该行的 ID 不会更改。
现在我想更改代码以添加一些新功能,同时为 ID 生成纯随机数可以大大简化我的工作(说来话长,为什么我更容易生成它在我能够获得哈希算法的所有必要字段内容之前的 ID)
我知道通常编程语言自己的随机生成器会生成伪随机数,但我使用的是Python的random.SystemRandom(),它使用操作系统的密码级别'true' 随机生成器,所以我认为与使用哈希算法生成ID相比,它应该是相同的碰撞概率。
我的理解对吗?如果不是,为什么?
生成 X 个字节的随机数据给出的碰撞概率与在某些 ID 上使用哈希函数完全相同...
假设...
- 您使用哈希函数的列本身是唯一的。
- #1 你没有犯错
我建议使用系统的加密随机数提供程序。因为你可能犯了错误。这是一个简单的:
您的系统:连接第 1 列和第 2 列,并对结果进行哈希处理。您可以保证您永远不会再对第 1 列和第 2 列的那些值执行此操作。从来没有。
什么时候:
- 第 1 列 = "abc"
- 第 2 列 = "def"
对
- 第 1 列 = "ab"
- 第 2 列 = "cdef"
那些将创建相同的哈希函数。
那么你更信任谁给你随机数据呢?你自己?还是一个操作系统开发团队,包括密码学专家和数十年的研究和经验? :)
使用系统的加密随机函数。