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位数组哈希是本地粗略测试中执行速度最快的