【问题标题】:MD5 etc. as a hash functionMD5 等作为哈希函数
【发布时间】:2011-05-05 18:34:46
【问题描述】:

假设您计划设计一个哈希函数,该函数将生成 0-256 之间的密钥。使用 MD5-digest 的前 2 位数字是均匀分布的好主意吗?您对此有何看法? md5() 一些单词(2-10 个字母)是否昂贵?

我知道这是对需求的粗略定义,但最好讨论一下。

【问题讨论】:

  • 我想不能保证 MD5 哈希的子集具有均匀分布(类似于 GUID 的工作方式)。
  • 考虑到一个多兆字节的文件可以像在现代硬件上“立即”进行 MD5 编辑......但是,输入这么短,嗯.. 嗯。
  • 出于好奇,为什么要将两个字符串散列为两个字符散列?
  • 我同意大卫的观点。您最好只编写一个快速测试应用程序来运行您的设计数千次,这样您就可以了解成本和统计分布。
  • 如果您正在寻找 1 字节哈希。也许 CRC8 会更好。

标签: hash


【解决方案1】:

你可以试试 calculating 一个 8 位的 CRC

【讨论】:

    【解决方案2】:

    你还没有解释你将如何使用哈希,以及你将如何处理不可避免的冲突,因为你只有 256 个输出值。

    我认为即使是 MD5(它不再具有加密安全性)对于可能的应用程序来说也是多余的。

    我可能会使用CRC(循环冗余校验)算法,它会为您生成一个 16 位或 32 位数字,并且可能会为您提供足够好的分布。

    【讨论】:

      【解决方案3】:

      没有理由将加密强度散列用于生成 3 位散列这样简单的事情。你最好在那里使用更简单的哈希。

      我不确定 MD5 相对于其他方法的成本到底有多高,但是有很多更好的方法可以创建一个小散列(请参阅 this article 了解一些算法思路)。

      【讨论】:

        【解决方案4】:

        MD5 旨在将输入均匀地分布在所有输出字节上,因此它与任何其他通用散列函数一样好 - 如果您只想要 256 个值,这听起来有点矫枉过正。

        注意 MD5 的输出是 128 字节(16 字节),它只是十六进制数字的文本表示 - 所以实际上没有 MD5 的前两位 - 只需使用底部的 8 位。

        【讨论】:

        • MD5 的输出大于可能的输入(2-10 字节)。
        • 这不是理想哈希函数的定义吗 ;-) 正如我所说 MD5 对这个来说太过分了,但是如果你有一个可用的 MD5 函数,为什么要自己编写呢?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多