布尔值和整数的最快哈希值?

时间:2018-05-29 22:14:53

标签: javascript hash hashmap

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

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

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

例如:

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

可以减少到[1,42,3],然后可以用作对象的查找键,但是将此数组转换为字符串作为哈希键不会起作用,因为&# 39;无法区分[1,4,23]

我已经在hash algorithm for variable size boolean array尝试了这些建议,当我的对象适合32位TypedNumberArray时这很有用 - 但是一旦我需要其中几个数组并在其上调用toString() ,它变慢(但仍然比JSON.stringify快得多)

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

谢谢!

3 个答案:

答案 0 :(得分: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 }

答案 1 :(得分:0)

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

仍然很好奇看到这个问题的其他解决方案:)

答案 2 :(得分:-1)

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

var lookup = [true,42,3]

您可以将其用作哈希值:

var values = {}
values[lookup] = foo