BigQuery:哈希字符串与 CityHash 不匹配
BigQuery: Hashing a String Doesn't Match CityHash
试图让我的外部 CityHash 达到 return 与 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 在对字符串进行哈希处理之前是否对其进行了特殊处理?
好的,我花了一些时间查看代码,这就是我认为发生的情况。
- BigQuery 对 CityHash 的实现基于版本 1.0.3 中的代码(仍可从此处下载 https://code.google.com/p/cityhash/downloads/detail?name=cityhash-1.0.3.tar.gz)
- 您使用的 golang 实现似乎是 1.1.1 版本的端口(可以从这里下载https://code.google.com/p/cityhash/downloads/detail?name=cityhash-1.1.1.tar.gz)
不幸的是,这些版本自 1.1 版以来似乎不兼容,如 README 中所述(重点是我的):
CityHash v1.1, October 22, 2012
- Add CityHash32(), intended for 32-bit platforms.
- Change existing functions to improve their hash quality and/or speed. > Most
of the changes were minor, but CityHashCrc* was substantially reworked
(and made perhaps 10% slower, unfortunately).
- Improve README.
我不确定在这里做什么是正确的,也许 BigQuery 应该更新其实现以匹配版本 1.1.1,或者这对依赖它的现有用户来说可能是一个重大变化。但至少我们知道现在发生了什么。
试图让我的外部 CityHash 达到 return 与 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 在对字符串进行哈希处理之前是否对其进行了特殊处理?
好的,我花了一些时间查看代码,这就是我认为发生的情况。
- BigQuery 对 CityHash 的实现基于版本 1.0.3 中的代码(仍可从此处下载 https://code.google.com/p/cityhash/downloads/detail?name=cityhash-1.0.3.tar.gz)
- 您使用的 golang 实现似乎是 1.1.1 版本的端口(可以从这里下载https://code.google.com/p/cityhash/downloads/detail?name=cityhash-1.1.1.tar.gz)
不幸的是,这些版本自 1.1 版以来似乎不兼容,如 README 中所述(重点是我的):
CityHash v1.1, October 22, 2012
- Add CityHash32(), intended for 32-bit platforms.
- Change existing functions to improve their hash quality and/or speed. > Most of the changes were minor, but CityHashCrc* was substantially reworked (and made perhaps 10% slower, unfortunately).
- Improve README.
我不确定在这里做什么是正确的,也许 BigQuery 应该更新其实现以匹配版本 1.1.1,或者这对依赖它的现有用户来说可能是一个重大变化。但至少我们知道现在发生了什么。