MD5 哈希背后的原因?
Reason behind MD5 Hashing?
我有时看到并被推荐将字符串和关联数组键存储为 MD5 哈希值。现在我已经从麻省理工学院 - OCW 6.046j 了解了散列,它似乎更像是一种以高效格式存储数据以进行快速搜索并防止人们找回原始数据的方案。
但是支持关联数组/字典的语言不是在内部执行此操作吗? MD5 哈希值有什么额外优势?
大多数语言可能在内部支持这一点,例如参见 [=45=] 的 hashcode(), which is used when storing keys in a HashMap:
Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by HashMap.
但有些场景你想自己做。
场景 1 - 在数据库中用作键:
假设您有一个很大的 no-sql
-ish 字母数据库和这些字母的元数据。您希望无需搜索即可快速找到一封信的元数据。你的指数是多少?
一个选项是使用与信件内容无关的 运行 索引,但是您必须搜索数据库才能找到文档的元数据。另一种选择是为由其前缀组成的文档创建签名(这只是众多示例中的一个),但某些文档可能共享此 属性 ("Dear John,").
那么考虑整个文档怎么样?这就是您可以使用 md5 作为文档行键的地方。
在这种情况下,你依赖于拥有 no collisions,支持这一假设的论点通常提到你 运行 成为疯狂大猩猩的机会( 通常) 更大。安全哈希算法系列产生的冲突更少。
我提到这一点是因为数据库通常不会开箱即用(框架 可能...)。
场景 2 - 密码存储的单向散列:
注意: 这可能不再适用于 md5,但它适用于 SHA
-family 变体。
在这种情况下,您希望将密码存储在数据库中,但如果数据库遭到破坏,存储纯文本密码可能会有缺点(用户经常跨站点共享密码 - 可能会导致其他站点上的帐户也遭到破坏).此处散列的用法是存储散列密码,当用户尝试登录时,您只比较散列而不是密码本身。这样你就不需要本地存储的密码,而且破解起来要困难得多。
我有时看到并被推荐将字符串和关联数组键存储为 MD5 哈希值。现在我已经从麻省理工学院 - OCW 6.046j 了解了散列,它似乎更像是一种以高效格式存储数据以进行快速搜索并防止人们找回原始数据的方案。 但是支持关联数组/字典的语言不是在内部执行此操作吗? MD5 哈希值有什么额外优势?
大多数语言可能在内部支持这一点,例如参见 [=45=] 的 hashcode(), which is used when storing keys in a HashMap:
Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by HashMap.
但有些场景你想自己做。
场景 1 - 在数据库中用作键:
假设您有一个很大的 no-sql
-ish 字母数据库和这些字母的元数据。您希望无需搜索即可快速找到一封信的元数据。你的指数是多少?
一个选项是使用与信件内容无关的 运行 索引,但是您必须搜索数据库才能找到文档的元数据。另一种选择是为由其前缀组成的文档创建签名(这只是众多示例中的一个),但某些文档可能共享此 属性 ("Dear John,").
那么考虑整个文档怎么样?这就是您可以使用 md5 作为文档行键的地方。
在这种情况下,你依赖于拥有 no collisions,支持这一假设的论点通常提到你 运行 成为疯狂大猩猩的机会( 通常) 更大。安全哈希算法系列产生的冲突更少。
我提到这一点是因为数据库通常不会开箱即用(框架 可能...)。
场景 2 - 密码存储的单向散列:
注意: 这可能不再适用于 md5,但它适用于 SHA
-family 变体。
在这种情况下,您希望将密码存储在数据库中,但如果数据库遭到破坏,存储纯文本密码可能会有缺点(用户经常跨站点共享密码 - 可能会导致其他站点上的帐户也遭到破坏).此处散列的用法是存储散列密码,当用户尝试登录时,您只比较散列而不是密码本身。这样你就不需要本地存储的密码,而且破解起来要困难得多。