1

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

描述

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

返回类型

INT64

请注意,返回类型是 INT64,在 bigquery 中是64 位带符号的 int

但是,如果我们查看Fingerprint64 的实际实现,我们可以在头文件中看到它返回一个无符号的64 位 int。

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

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

4

1 回答 1

1

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

于 2018-10-22T15:52:28.627 回答