Google bigquery BigQuery';s FARM_指纹表示64位*无符号*整数?

Google bigquery BigQuery';s FARM_指纹表示64位*无符号*整数?,google-bigquery,Google Bigquery,BigQuery方便地包括FARM\u FINGERPRINT功能。以下是此函数的示例摘录: 说明 使用来自开源FarmHash库的Fingerprint64函数计算输入的字符串或字节的指纹。对于特定输入,此函数的输出永远不会更改 返回类型 INT64 请注意,返回类型是INT64,在bigquery中是 但是,如果我们看一下,我们可以在头文件中看到它返回一个无符号的64位int 问题是64位无符号整数的最大值是64位有符号整数的两倍。因此,有一半时间,FARM_FINGERPRINT将生成超出

BigQuery方便地包括
FARM\u FINGERPRINT
功能。以下是此函数的示例摘录:

说明

使用来自开源FarmHash库的Fingerprint64函数计算输入的字符串或字节的指纹。对于特定输入,此函数的输出永远不会更改

返回类型

INT64

请注意,返回类型是INT64,在bigquery中是

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

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


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

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

玩弄FARM_FINGERPRINT64,看起来bigquery只是让值溢出并“环绕”到整数范围的负端。文档可以说有符号的64位整数有一个
静态\u cast
。文档说它使用“来自开源FarmHash库的Fingerprint64函数”,但并不是说它就是那个函数。由于BigQuery中的int64是有符号的,所以它不能具有与uint64(无符号)相同的值,所以应用它是为了使它们适合,将第一位作为有符号的大。(正如您所解释的,@ElliottBrossard和Conrad Lee)我将提供您关于改进此文档的反馈,并将我的评论发布为社区wiki:)您是说用户应该知道此功能与开源库不同,因为它没有明确表示完全相同?我认为这对用户不公平。主要目的之一是FarmHash的(及其前面的杂音hash)是跨系统的一致性,这是一个非常有用的属性。因此我认为,如果没有明确的警告,用户不会期望这与它所基于的开源函数不一致。文档中的警告可能会为BigQuery用户省去一些麻烦!我根本没有说这一点,我报告了文档应该改进,因为我也不清楚。