【问题标题】:Fastest hash of booleans and integers?最快的布尔值和整数散列?
【发布时间】:2018-11-08 15:56:19
【问题描述】:

我的高级目标是能够通过值而不是通过引用来比较特定对象(具有相同类型)。对象中的每个值都是布尔值或数字,速度至关重要。

稍微分解一下,我正在寻找一个非常快速的函数,从这个对象到字符串或数字(即哈希),以便我可以在哈希表中查找比较。

我很高兴内联所有提高速度的要求 - 它不需要是自动的,也不需要检查任何typeof

例如:

const foo = {
  a: true,
  b: {
    c: 42
  }
  d: 3
}

可以减少到[1,42,3],然后可以用作对象的查找键,但是将此数组转换为字符串作为哈希键将不起作用,因为没有办法区别于 [1,4,23]

我已经尝试了 hash algorithm for variable size boolean array 的建议,当我的对象可以放入 32 位 TypedNumberArray 时效果很好 - 但是一旦我需要其中几个数组并在它们上调用 toString(),它就会变慢(仍然然而,比 JSON.stringify 快得多)

目标语言是 javascript,但如果有帮助,我很高兴看到 C 或其他语言的代码示例。

谢谢!

【问题讨论】:

  • 如果你想要可逆性,那么你就不需要哈希。
  • 散列函数的另一个名称是单向陷门。你只能走一条路。
  • Whups - “以及相反”这行是一个意外......现在删除它,谢谢!

标签: javascript hash hashmap


【解决方案1】:

这个怎么样?

class Lookup {
  constructor() {
    this.lookup = {}
  }

  insert(value) {
    if (!(value.a in this.lookup))
      this.lookup[value.a] = {}
    if (!(value.b.c in this.lookup[value.a]))
      this.lookup[value.a][value.b.c] = {}
    this.lookup[value.a][value.b.c][value.d] = value
  }
}

const l = new Lookup()
const foo = {
  a: true,
  b: {
    c: 42
  },
  d: 3
}
l.insert(foo)
console.log('l.lookup[true][42][3] =', l.lookup[true][42][3])

输出是:

l.lookup[true][42][3] = { a: true, b: { c: 42 }, d: 3 }

【讨论】:

  • 这样做绝对是另一种选择,谢谢!
  • 32 位整数块的速度更快 - 虽然看起来更干净:)
【解决方案2】:

哎呀,愚蠢的错误!正如@joseph-silber 指出的那样,逗号包含在 Array.toString() 中,所以这不是问题。

仍然 - 很想看看这个问题的其他解决方案:)

【讨论】:

  • 值得指出的是 - Array.toString() 比 number.toString 慢得多,因此 32 位数组哈希是我本地粗略测试中表现最快的
【解决方案3】:

如果将查找键设置为实际值

var lookup = [true,42,3]

您可以将其用作哈希值:

var values = {}
values[lookup] = foo

【讨论】:

  • 不把它变成哈希值,它通过引用查找数组
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2016-02-19
  • 2012-11-04
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
相关资源
最近更新 更多