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中的输出不同于其他系统中的标准输出。如果存在这种差异,则至少应在记录时注明警告!
答案 0 :(得分:1)
该文档说它使用“来自开源FarmHash库的Fingerprint64函数”,但没有说它与它完全相同。而且由于BigQuery中的int64是带符号的,因此它的值不能与uint64(无符号)相同,因此应用二进制补码以使它们适合以第一个位作为带符号的位。 (就像@ElliottBrossard和Conrad Lee找到的一样)