BigQuery的FARM_FINGERPRINT如何代表64位* unsigned * int?

时间:2018-08-17 10:04:05

标签: google-bigquery

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

  

说明

     

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

     

返回类型

     

INT64

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

但是,如果我们查看the actual implementation of Fingerprint64,就可以在头文件中看到它返回了一个 unsigned 64位int。

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

执行此操作的一种方法将只是使值溢出,从而导致值回绕到有符号int的负范围内。但是,由于Fingerprint64是一个可移植函数,因此设计似乎很糟糕,因为BigQuery在BigQuery中的输出不同于其他系统中的标准输出。如果存在这种差异,则至少应在记录时注明警告!

1 个答案:

答案 0 :(得分:1)

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