Javascript 布尔和整数的最快散列?

Javascript 布尔和整数的最快散列?,javascript,hash,hashmap,Javascript,Hash,Hashmap,我的高级目标是能够通过值而不是引用来比较特定对象(具有相同类型)。对象中的每个值都是布尔值或数字,速度至关重要 把它分解一下,我正在寻找一个非常快速的函数,它从这个对象出发,转换成字符串或数字(即散列),这样我就可以在散列表中查找比较 我很高兴内联所有关于速度增益的调用-它不需要是自动的,也不需要检查任何typeof 例如: const foo = { a: true, b: { c: 42 } d: 3 } 可以缩减为[1,42,3],然后可以用作对象的查找键,但将此

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

把它分解一下,我正在寻找一个非常快速的函数,它从这个对象出发,转换成字符串或数字(即散列),这样我就可以在散列表中查找比较

我很高兴内联所有关于速度增益的调用-它不需要是自动的,也不需要检查任何
typeof

例如:

const foo = {
  a: true,
  b: {
    c: 42
  }
  d: 3
}
可以缩减为[1,42,3],然后可以用作对象的查找键,但将此数组转换为字符串作为散列键将不起作用,因为无法将其与[1,4,23]区分开来

我已经在尝试了这些建议,当我的对象可以放入32位TypedNumberArray时效果很好——但一旦我需要几个这样的数组并对它们调用
toString()
,它就会变慢(但仍然比JSON.stringify快得多)

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


谢谢

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

var lookup = [true,42,3]
您可以将其用作哈希值:

var values = {}
values[lookup] = foo

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

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

这个怎么样

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 }

如果你想要可逆性,那么你就不想要散列。散列函数的另一个名称是单向陷门。你只能走一条路。Whups-这句“以及相反的”是一个意外。。。现在删除它,谢谢!这并不会将其转换为散列值,而是通过引用来查找数组。这样做肯定是另一种选择,谢谢!32位整数块的速度更快,虽然看起来更干净:)值得指出,但是-Array.toString()比number.toString慢很多,所以32位数组哈希是本地粗略测试中执行速度最快的