使用 sha1[:10] 或 MD5 进行哈希处理进行缓存,MD5 更好吗?

Hashing with sha1[:10] or MD5 for caching, is MD5 is better?

提问人:Yehuda 提问时间:10/29/2023 最后编辑:Maarten BodewesYehuda 更新时间:10/30/2023 访问量:69

问:

我试图找到快速且简短的良好哈希函数

有讨论 哈希函数 产生短哈希?

他们建议使用:

>>> 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 更好,我是否遗漏了什么?

  • 有没有更好的快速和简短的哈希

python 缓存 哈希 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