【问题标题】:How does BigQuery's FARM_FINGERPRINT represent a 64-bit *unsigned* int?BigQuery 的 FARM_FINGERPRINT 如何表示 64 位 *unsigned* int?
【发布时间】:2018-08-17 10:04:05
【问题描述】:

BigQuery 方便地包含 FARM_FINGERPRINT 函数。这是此功能的documentation 的摘录:

说明

使用开源 FarmHash 库中的 Fingerprint64 函数计算 STRING 或 BYTES 输入的指纹。对于特定输入,此函数的输出永远不会改变。

返回类型

INT64

请注意,返回类型为 INT64,在 bigquery 中为 a 64-bit signed int

但是,如果我们查看the actual implementation of Fingerprint64,我们可以在头文件中看到它返回一个无符号 64 位整数。

问题 64 位无符号整数的最大值是 64 位有符号整数的两倍。因此,有一半时间,FARM_FINGERPRINT 将生成一个超出 BigQuery INT64 可表示范围的输出。在这种情况下,BigQuery 会做什么?它以某种方式将Fingerprint64 的输出转换为适合有符号整数的范围,但文档没有说明如何。

这样做的一种方法是让值溢出,导致值环绕到带符号整数的负范围内。但是,由于Fingerprint64 是一个可移植函数,这似乎是一个糟糕的设计,因为它在 BigQuery 中的输出与其他系统中的标准输出不同。如果存在这种差异,至少应该用一个大的警告来记录它!

【问题讨论】:

  • 玩弄 FARM_FINGERPRINT64,看起来 bigquery 只是让值溢出并“环绕”到整数范围的负侧。
  • 文档可以说有一个有符号的 64 位整数有一个 static_cast
  • 文档说它使用了“来自开源 FarmHash 库的 Fingerprint64 函数”,但并不是说它就是那个函数。而且由于 BigQuery 中的 int64 是有符号的,它不能具有与 uint64(无符号)相同的值,因此应用 Two's complement 以使它们适合将第一位作为有符号大。 (正如您所解释的,@ElliottBrossard 和 Conrad Lee)
  • 我将提供您关于改进相关文档的反馈,并将我的评论发布为社区 wiki :)

标签: google-bigquery


【解决方案1】:

文档说它使用“来自开源 FarmHash 库的 Fingerprint64 函数”,但没有说它与它的函数完全相同。并且由于 BigQuery 中的 int64 是有符号的,它不能具有与 uint64(无符号)相同的值,因此应用二进制补码以使它们适合将第一位作为有符号位。 (就像@ElliottBrossard 和 Conrad Lee 发现的那样)

【讨论】:

  • 你是说用户应该知道这个Fingerprint64函数不同于开源库,因为它没有明确说它完全一样?我认为这对用户不公平。 FarmHash(以及之前的 MurmurHash)的主要目的之一是跨系统保持一致,这是一个非常有用的属性。所以我认为,如果没有一些明确的警告,用户不会期望这与它所基于的开源功能不一致。文档中的警告可能会让 BigQuery 用户免去一些麻烦!
  • 我不是在说这个,我报告说应该改进文档,因为我也不清楚。
猜你喜欢
  • 2013-08-01
  • 2014-11-25
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
相关资源
最近更新 更多