HyperLogLog算法一直困扰我的是它对密钥散列的依赖。我的问题是,这篇论文似乎假设我们在每个分区上有一个完全随机的数据分布,然而在它经常使用的上下文中(MapReduce风格的作业),事情通常是通过它们的哈希值分布的,所以所有重复的键都将在同一个分区上。对我来说,这意味着我们实际上应该添加HyperLogLog生成的基数,而不是使用某种平均技术(在我们通过散列与HyperLogLog散列相同的东西进行分区的情况下)。
所以我的问题是:这是HyperLogLog的真正问题还是我没有足够详细地阅读论文
如果对两个任务都使用非独立的哈希函数,这是一个真正的问题。
假设分区根据哈希值的第一个b
位来决定节点。如果对分区和HyperLogLog使用相同的哈希函数,算法仍然可以正常工作,但会牺牲精度。在实践中,它将相当于使用m/2^b
桶(log2m' = log2m-b),因为第一个b
位将始终是相同的,所以只有log2m-b
位将用于选择HLL桶。