试图让我的外部CityHash返回与BigQuery Hash()相同的值。
这是我要匹配的值:
唯一匹配的哈希字符串是空白字符串。
在BigQuery Query Reference中,它提到它使用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)
}
这是我程序的输出:
Hashed version of 'mystringtohash': -6615946700494525143
Hashed version of '1234': 882600748797058222
Hashed version of '': -7286425919675154353
BigQuery在对字符串进行哈希处理之前是否对它做了一些特殊的处理?
最佳答案
好的,我花了一些时间浏览代码,这就是我认为发生的情况。
不幸的是,如README中所述,这些版本自1.1版以来似乎是不兼容的(强调是我的):
CityHash v1.1,2012年10月22日
的更改很小,但对CityHashCrc *进行了实质性的重做
(不幸的是,速度可能降低了10%)。
我不确定在这里做什么是正确的,也许BigQuery应该更新其实现以匹配版本1.1.1,或者对于依赖它的现有用户而言,这可能是一个重大变化。但是至少我们知道现在发生了什么。