尝试让我的外部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在对它进行散列之前是否对字符串做了一些特殊的事情?
答案 0 :(得分:5)
好的,我花了一些时间浏览代码,这就是我认为发生的事情。
不幸的是,这些版本似乎与版本1.1不兼容,如README中所述(重点是我的):
CityHash v1.1,2012年10月22日
- 添加CityHash32(),适用于32位平台。
- 更改现有功能以提高其哈希质量和/或速度。 >最 这些变化很小,但CityHashCrc *大幅重修 (不幸的是,速度慢了10%)。
- 改进自述文件。
我不确定在这里做什么是正确的,也许BigQuery应该更新其实现以匹配版本1.1.1,或者它可能是对依赖它的现有用户的重大改变。但至少我们知道现在发生了什么。