Algorithm 用于对多个任意值进行比较的存储算法

Algorithm 用于对多个任意值进行比较的存储算法,algorithm,memory-management,comparison,Algorithm,Memory Management,Comparison,我目前正在编写一个消息队列,它要求我保存服务器已经看到的消息的历史记录。我为每条消息提供了唯一的、固定大小的ID字段,这使得它变得微不足道。但是,我担心的是存储每条消息的ID的长期前景,以及以后比较它们的延迟。我当前的ID长度为160位(是的,SHA1) 理想情况下,我想知道的是,是否有一种方法可以将多个ID压缩到一个字段中以节省内存,如果有,作为消息压缩的函数,算法的错误pos和错误neg率是多少。理想情况下,我并不真正关心假阴性率,而是关心大量的假阳性,这使得像agrep这样的比较非常有趣。

我目前正在编写一个消息队列,它要求我保存服务器已经看到的消息的历史记录。我为每条消息提供了唯一的、固定大小的ID字段,这使得它变得微不足道。但是,我担心的是存储每条消息的ID的长期前景,以及以后比较它们的延迟。我当前的ID长度为160位(是的,SHA1)


理想情况下,我想知道的是,是否有一种方法可以将多个ID压缩到一个字段中以节省内存,如果有,作为消息压缩的函数,算法的错误pos和错误neg率是多少。理想情况下,我并不真正关心假阴性率,而是关心大量的假阳性,这使得像agrep这样的比较非常有趣。

这个问题没有包含足够的信息来给出明确的答案,但是您可能想看看。

我建议使用MD5,它是每条消息的128个摘要。冲突显然是不相关的,因为您总是可以逐个字节重复检查任何匹配的字节。128位的优点是它比SHA1略短(16字节)


您可以将MD5存储在基数树中。这将使数据紧凑且易于搜索。

我认为您需要一个持久哈希映射或持久集。大多数哈希映射/集实现通过比较实际对象来处理冲突


如果您的所有密钥散列都可以存储在内存中,那么这将导致一个摊销的固定时间查找。

这里是一个幼稚的问题。为什么不使用流动数字?@AdamSmith:我确实想到了。由于多台服务器有多个可能的运行编号,因此无法执行此操作。(请考虑“对等节点分发”,其中节点中继来自其他节点的消息,并且消息需要至少击中每个人一次。)托马斯:我会编辑。同时,Bloom过滤器背后的想法很好。然而,我正在寻找完全相反的属性:没有误报,需要多少误报就有多少。我不介意重新发送数据——不过我介意数据从网格上掉下来。@SébastienRenauld/可能会有所帮助。