Hash BigQuery:对字符串进行散列不会';与城市灰烬不相称

Hash BigQuery:对字符串进行散列不会';与城市灰烬不相称,hash,google-bigquery,Hash,Google Bigquery,正在尝试使我的外部CityHash返回与BigQuery Hash()相同的值。 以下是我试图匹配的值: 唯一匹配的哈希字符串是空白字符串 在文章中,它提到它使用了CityHash图书馆。我曾尝试为CityHash使用多个外部库,它们彼此一致,但与BigQuery Hash()不一致 以下是Go(Golang)城市灰烬的一个例子: 以下是我的程序的输出: Hashed version of 'mystringtohash': -6615946700494525143 Hashed versio

正在尝试使我的外部CityHash返回与BigQuery Hash()相同的值。 以下是我试图匹配的值:

唯一匹配的哈希字符串是空白字符串

在文章中,它提到它使用了CityHash图书馆。我曾尝试为CityHash使用多个外部库,它们彼此一致,但与BigQuery Hash()不一致

以下是Go(Golang)城市灰烬的一个例子:

以下是我的程序的输出:

Hashed version of 'mystringtohash': -6615946700494525143
Hashed version of '1234': 882600748797058222
Hashed version of '': -7286425919675154353

在对字符串进行哈希运算之前,BigQuery是否对其进行了特殊处理?

好的,我花了一些时间研究了代码,下面是我认为发生的情况

  • BigQuery对CityHash的实现基于版本1.0.3中的代码(仍然可以从这里下载)
  • 您使用的golang实现似乎是版本1.1.1的端口(可从此处下载)
不幸的是,自1.1版以来,这些版本似乎不兼容,如自述文件中所述(重点是我的):

CityHash v1.12012年10月22日

  • 添加CityHash32(),用于32位平台
  • 更改现有函数以提高其哈希质量和/或速度。>最 其中一项改动很小,但CityHashCrc*进行了实质性改造 (不幸的是,这可能会降低10%)
  • 改进自述

我不确定在这里做什么是正确的,也许BigQuery应该更新它的实现以匹配版本1.1.1,或者对于依赖它的现有用户来说,这将是一个突破性的改变。但是至少我们知道现在正在发生什么。< /P>你能更新你的显示你的程序输出的帖子吗?对于我来说,BigQu查询结果与C++ CITYHASH库是一致的,并且我不能在GO游戏场中运行你的GO程序,它没有找到导入的CythHASH(我对GO程序一无所知)OK,我从GO代码中添加了结果。谢谢你看…谢谢你花时间回答这个问题!我想我们最终会用FarmHash来代替。希望谷歌有一天能将其添加到BigQuery函数中……请注意,FarmHash在跨平台的情况下是不稳定的。如果一个不稳定的散列是可接受的用例,那么一个旧版本的Cyyhash也可以为你工作。@ Michael Sheldon:这是一个很好的点,一定要考虑切换时…
Hashed version of 'mystringtohash': -6615946700494525143
Hashed version of '1234': 882600748797058222
Hashed version of '': -7286425919675154353