试图让我的外部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在对字符串进行哈希处理之前是否对它做了一些特殊的处理?

最佳答案

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

  • CityHash的BigQuery实现基于版本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)

  • 不幸的是,如README中所述,这些版本自1.1版以来似乎是不兼容的(强调是我的):

    CityHash v1.1,2012年10月22日


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


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

    10-02 11:31