MD5等作为哈希函数

4
假设您计划设计一个哈希函数,它将生成介于0-256之间的键。使用MD5摘要的前2个数字是否是实现均匀分布的好主意?您对此有何看法?使用md5()加密一些单词(2-10个字母)是否很昂贵?
我知道这是对要求的粗略定义,但讨论这个问题会很棒。

我想象一个 MD5 哈希的子集没有像 GUIDs 一样均匀分布的保证。 - David
考虑到现代硬件可以像“瞬间”一样对多兆字节的文件进行MD5处理...然而,由于输入太短,嗯...嗯。 - user166390
出于好奇,你为什么要将两个字符字符串哈希成两个字符哈希? - user229044
我同意David的观点。你最好写一个快速测试应用程序,运行你的设计数千次,这样你就可以了解成本和统计分布情况。 - Spencer Hakim
2
如果你正在寻找一个1字节的哈希值,也许CRC8会更适合。 - tidwall
如果您需要从字符串生成一个尽可能均匀分布的[0, 255]值哈希函数,那么您会使用什么? - ahmet alp balkan
4个回答

4

对于生成3位哈希值这样简单的任务,没有必要使用加密强度哈希函数。更好的选择是使用更简单的哈希函数。

我不确定相对于其他哈希函数来说MD5有多昂贵,但是有很多更好的方法可以创建小型哈希值(请参见此文章以获取一些算法思路)。


3

1

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

请注意,MD5的输出为128字节(16字节),只是文本表示形式为十六进制数字-因此实际上没有MD5的前两个数字-只需使用底部8位即可。


MD5 的输出长度比可能的输入(2-10 字节)要大。 - Jonathan Leffler
1
这不是理想的哈希函数的定义吗?;-) 正如我所说,MD5 对此来说太过复杂,但如果你有可用的 MD5 函数,为什么要自己编写呢? - Martin Beckett

0

你还没有解释你将如何使用哈希,以及在仅有256个输出值的情况下不可避免的冲突会发生什么。

我认为即使是MD5(现在已经不再是加密安全的了),也对可能的应用程序来说过于复杂了。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接