提问人:Yehuda 提问时间:10/29/2023 最后编辑:Maarten BodewesYehuda 更新时间:10/30/2023 访问量:69
使用 sha1[:10] 或 MD5 进行哈希处理进行缓存,MD5 更好吗?
Hashing with sha1[:10] or MD5 for caching, is MD5 is better?
问:
我试图找到快速且简短的良好哈希函数
有讨论 哈希函数 产生短哈希?
他们建议使用:
>>> import hashlib
>>> hash = hashlib.sha1("my message".encode("UTF-8")).hexdigest()
>>> hash
'104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb'
>>> hash[:10]
'104ab42f11'
有对比表 在这个链接中 https://www.tutorialspoint.com/difference-between-md5-and-sha1 这表明 MD5 比 SHA1 更快
问题是:
对于缓存对象(不是安全目的),似乎使用 MD5 比 SHA1 更好,我是否遗漏了什么?
有没有更好的快速和简短的哈希
答:
0赞
Maarten Bodewes
10/29/2023
#1
对于缓存对象(不是安全目的),似乎使用 MD5 比 SHA1 更好,我是否遗漏了什么?
首先,请注意,很容易产生 MD5 冲突,因此人们可以将其用作攻击媒介。因此,您必须确保这不会造成任何安全问题。
MD5 当然可以比 SHA-1 更快,但请不要忘记这取决于实现。我见过性能非常糟糕的 MD5 实现,并且当前的 CPU 内置了 SHA-1 加速(英特尔 SHA 扩展)。
有没有更好的快速和简短的哈希
是的,有一些不安全的哈希值,如xxHash(例如在库中),其性能应该明显优于任何加密哈希值。这并不奇怪,因为它们不需要完全的防撞性。xxhash
评论
0赞
olegarch
10/30/2023
对于缓存目的,可以通过 MD5 冲突来减轻攻击。只需要将一些“秘密词”连接到消息中,然后计算 MD5。我认为,16 字节的随机“盐”就足够了。当然,在缓存使用过程中,这种盐必须是恒定的。
0赞
olegarch
10/30/2023
#2
这是我自己的哈希函数,我将其用于搜索目的:
#define NLF(h, c) (rand[(uint8_t)(c ^ h)])
uint32_t rand[0x100] = { 256 random non-equal values };
uint32_t oleg_h(const char *key) {
uint32_t h = 0x1F351F35;
char c;
while(c = *key++)
h = ((h >> 11) | (h << (32 - 11))) + NLF(h, c);
h ^= h >> 16;
return h ^ (h >> 8);
}
函数计算文本字符串的 32 位哈希值。
为了缓解可能的对手攻击,该函数使用数组 rand[],使用随机整数值初始化。在缓存系统生命周期内,此阵列必须保持不变。在我的代码中,我从 初始化这个数组。/dev/urandom
如果您愿意,请随时从程序 emcssh 中获取和使用我的哈希搜索子系统。它使用方法。double hashing
评论