使用crc32而不是md5对memcached键进行哈希


Using crc32 over md5 for hashing memcached keys

我们目前使用MD5来散列我们想要在memcached中查找的密钥。

一个基本的例子是:

$sql = "SELECT * FROM articles WHERE id = 1";
$key = md5($sql);
if (!$results = $memcache->get($key)) {
    $results = $db->query($sql);
    $memcache->set($key, $results);
}

密钥大小都是32字节,因为它使用MD5对密钥进行哈希。

我们正在考虑使用crc32来代替哈希键来节省内存,例如:

$key = hash('crc32', $sql);

生成一个只有8字节的密钥。

这是一个足够好的解决方案来取代MD5作为密钥哈希吗?与钥匙碰撞的可能性增加了吗?

Read http://bretm.home.comcast.net/~bretm/hash/8.html (TL;DR: "CRC32从未打算用于哈希表。确实没有很好的理由将其用于此目的,我建议您避免这样做")。

你是否有那么多独特的查询,它保证切换到MD5以外的其他东西?如果是这样,考虑一些比CRC32更合适的东西,比如MurmurHash或CityHash。