HyperLogLog 使用哪个哈希函数?

Which hash function does HyperLogLog use?

我看过几篇文章,HyperLogLog和LogLog使用了一个hash函数,它单独负责预测值。如果我们为某个用户名分配一个值来预测个人访问页面的次数,并且该值对于名称是常量,算法将包含偏差.

例如,如果 Bob 被散列为 1000101 并且它的值始终是这个,算法将如何预测唯一用户访问页面的次数?即使有新的 Bob 访问该页面,所有 Bob 的值也始终为 1。谁能解释一下 LogLog 如何能够预测唯一身份访问者的价值。

我知道它使用 64 位哈希,上面的例子只是为了理解。

这里涉及两个独立的过程,我认为您的困惑来自于将它们两个混在一起。

您可以将 HyperLogLog 估计器视为具有两个操作的黑盒:

  • see(x),记录了x被看过,
  • estimate(),其中 returns 估计有多少个不同的值 seen。

在您的示例中,您正在讨论多个名为 Bob 的不同人访问网站的可能性,然后该网站多次调用 see(Bob)。在那种情况下,你是对的 - HyperLogLog 不知道这些是不同的人叫 Bob。但这与所使用的内部哈希函数无关——这纯粹是 HyperLogLog 只承诺估计它所看到的不同事物的数量这一事实的结果,如果你将每个名为 Bob 的人都视为“Bob”,HyperLogLog无法知道他们不是不同的人。

(打个比方,假设你让我数一数列表中有多少不同的人 [Bob, Bob, Bob, Bob, Bob]。我假设答案是“一个”,但如果你随后告诉我“实际上,每个 Bob 都是不同的人,”我的回答是“啊,我明白了,但是你让我解决问题的方式不公平,因为你没有给我任何信息来区分 Bob 和其他人。” )

但在实践中,如果您想计算网站的不同用户数,您不会只使用名字来识别一个人。例如,您可以使用一个人的 IP 地址,将不同的 IP 地址视为不同的访问者。或者您可能需要某种登录,然后使用个人的内部 ID 号。

至于HyperLogLog使用的是什么hash函数,那和上面的讨论是分开的。关于 HyperLogLog 的原始论文没有说明要使用哪个哈希函数,而只是假设给定的哈希函数看起来“足够随机”。在实践中,您会选择您认为看起来“足够随机”的任何哈希函数,这可能是 Jenkins 哈希或 SHA-256 等,具体取决于上下文。