【问题标题】:BigQuery: Hashing a String Doesn't Match CityHashBigQuery:散列字符串与 CityHash 不匹配
【发布时间】:2015-04-17 22:28:41
【问题描述】:

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

【问题讨论】:

  • 您能否更新您的帖子以显示您的程序输出。
  • 对我来说,BigQuery 结果与 C++ cityhash 库一致,我无法在 Go 操场上运行您的 Go 程序,它找不到 import cityhash(我对 Go 程序一无所知)
  • 好的,我添加了 Go 代码的结果。感谢您的关注...

标签: hash google-bigquery


【解决方案1】:

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

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

CityHash v1.1,2012 年 10 月 22 日

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

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

【讨论】:

  • 感谢您花时间回答这个问题!我认为我们最终将改用 FarmHash。希望 Google 有朝一日会将它添加到 BigQuery 函数中……
  • 请注意,FarmHash 被记录为跨平台不稳定。如果您的用例可以接受不稳定的哈希,那么旧版本的 CityHash 也可能适合您。
  • @Michael Sheldon:这点很好 切换时绝对要考虑的事情......
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
相关资源
最近更新 更多