我们目前使用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替换为密钥哈希?是否有与钥匙发生潜在碰撞的增加?
答案 0 :(得分:1)
阅读http://bretm.home.comcast.net/~bretm/hash/8.html(TL; DR:“CRC32从未打算用于哈希表。实际上没有充分理由将其用于此目的,我建议您不要这样做”)。
除了MD5之外,您是否还有许多独特的查询可以转换为其他内容?如果是这样,请考虑除CRC32之外更合适的内容,例如MurmurHash或CityHash。