BigQuery:散列字符串与CityHash不匹配

Joe*_*vin 3 hash google-bigquery

试图让我的外部CityHash返回与BigQuery Hash()相同的值.以下是我要匹配的值: BigQuery Hash示例

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

BigQuery查询参考中,它提到它使用CityHash库.我已经尝试过为CityHash使用多个外部库,它们彼此都是一致的,但不是BigQuery Hash()

以下是Go(Golang)的CityHash示例:

package main

import (
    "fmt"

    "bitbucket.org/creachadair/cityhash"
)

func main() {
    var bytesToHash = []byte("mystringtohash")

    myHash := int64(cityhash.Hash64(bytesToHash))
    fmt.Printf("Hashed version of '%s': %d\n", bytesToHash, myHash)

    bytesToHash = []byte("")
    myHash = int64(cityhash.Hash64(bytesToHash))
    fmt.Printf("Hashed version of '%s': %d\n", bytesToHash, myHash)
}
Run Code Online (Sandbox Code Playgroud)

这是我的程序的输出:

Hashed version of 'mystringtohash': -6615946700494525143
Hashed version of '1234': 882600748797058222
Hashed version of '': -7286425919675154353
Run Code Online (Sandbox Code Playgroud)

在散列之前,BigQuery是否对字符串做了一些特殊的事情?

Mos*_*sky 5

好的,我花了一些时间浏览代码,这就是我认为发生的事情.

不幸的是,这些版本似乎与版本1.1不兼容,如README中所述(重点是我的):

CityHash v1.1,2012年10月22日

  • 添加CityHash32(),用于32位平台.
  • 更改现有功能以提高其哈希质量和/或速度.>大多数变化都是次要的,但CityHashCrc*大幅度重新设计(不幸的是,速度可能慢了10%).
  • 改进自述文件.

我不确定在这里做什么是正确的,也许BigQuery应该更新它的实现以匹配版本1.1.1,或者它可能是对依赖它的现有用户的重大改变.但至少我们知道现在发生了什么.