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

时间:2015-04-17 22:28:42

标签: hash google-bigquery

尝试让我的外部CityHash返回与BigQuery Hash()相同的值。 以下是我要匹配的值: BigQuery Hash Examples

匹配的唯一散列字符串是空字符串。

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在对它进行散列之前是否对字符串做了一些特殊的事情?

1 个答案:

答案 0 :(得分:5)

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

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

  

CityHash v1.1,2012年10月22日

     
      
  • 添加CityHash32(),适用于32位平台。
  •   
  • 更改现有功能以提高其哈希质量和/或速度。 >最   这些变化很小,但CityHashCrc *大幅重修   (不幸的是,速度慢了10%)。
  •   
  • 改进自述文件。
  •   

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