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 中的输出与其他系统中的标准输出不同。如果存在这种差异,至少应该用一个大的警告来记录它!