【发布时间】:2011-11-10 13:12:41
【问题描述】:
背景:
我们正在构建一个邮件工具,目前已将emailaddresses 分隔到一个单独的表中,因此单个emailaddress 仅存储一次,而是由其id 引用。我们发现这是一个好主意,因为每封电子邮件的收件人数量可能很大,而且大多数电子邮件地址可能会收到超过 100 封电子邮件。
但是,当用户将emailaddresses 导入list 或类似操作时,我们首先需要批量插入以确保所有电子邮件地址都具有ids,我们只需忽略冲突即可。但是,当我们想要将它们插入到list 中时,我们必须一个接一个地获取emailaddresses,或者使用带有电子邮件地址的巨大IN 查询(因为list 引用emailaddress by id ),不是很诱人!
编辑:用户可能要导入 100.000 多个电子邮件地址,对于 1000 个左右的电子邮件地址,当然逐个查询并不是真正的问题。
问题:
所以一个想法是散列每个emailaddress 并将其用作id。这意味着,我们可以预测所有emailaddresses 的id,而无需查询它们。但是有没有什么好的算法,因为存储 16bytes/128bit+ 有点达不到目的...... 64bit 应该足够吗?鉴于这也应该被索引,这将不胜感激。
有什么建议吗?如果我们只是从 MD5 中取出前 8 个字节会怎样? SHA1 的 8 字节更好吗?也许有更专业的算法?我并不完全了解碰撞概率,但我很好奇现有算法在精简时的效果如何,因为电子邮件是小写的,主要是字母或数字。 (注意数据集可能会很大)
附言。我们使用的是 PHP,所以它在一定程度上限制了我们实现特殊算法的能力。
【问题讨论】:
标签: php sql hash md5 probability