Javascript 散列两个数字
Javascript Hashing Two Numbers
我有两个号码 javascript。
它们是积分坐标。
我还有一个对象:var regions = {};
我希望能够尽快访问特定对象。
例如在 (5,-2)
处可能有一个对象
为这样的两个数字创建不冲突的唯一哈希值的快速方法是什么?
示例:
var regions = {
'5,-2': { ... },
'1,3': { ... }
};
然后,如果您有 2 个数字,您可以轻松生成密钥并访问相应的对象:
var x = 5;
var y = -2;
var obj = regions[x + ',' + y];
我使用了两个函数 encode
和 decode
。
var x = 10;
var y = -3.2;
function encode(x, y) {
return x + ',' + y;
}
function decode(code) {
var xy = code.split(',');
return [+xy[0], +xy[1]];
}
var code = encode(x, y);
console.log(code);
var xy = decode(code);
console.log(xy);
code
可以作为字典键值。
我假设您要访问的 "specific objects" 被 regions
上的属性引用。 JavaScript 中的对象属性由字符串名称或 Symbol
名称命名。在这种情况下,您将使用字符串。
因为它是按字符串来的,所以简单的解决方案就是创建一个字符串,然后用它来查找:
var obj = regions[num1 + "," + num2];
这让 JavaScript 引擎能够很好地查找 属性。 JavaScript 引擎在这方面非常好(阅读:快速),因为他们必须很多。
引擎如何进行查找在某种程度上取决于 regions
对象的创建方式。在可能的情况下,现代引擎将创建有效微型 类 的对象,并提供非常快速的 属性 名称解析。如果你做了某些事情(比如在其中一个属性上使用 delete
),现代引擎可能会退回到 "dictionary" 模式,它使用散列查找。这仍然很快,只是不如优化后的形式快。
我怀疑您会找到更快的方法。理论上,如果 region
是一个连续数组,其中元素引用连续数组,则 JavaScript 引擎可以隐藏这些真实数组,并且您的示例数字之一是负数,这将阻止真实数组正在使用。而且您仍然会进行两次查找(第一个数字,然后是第二个),并且不能保证它会更快。肯定会更复杂。
正如您所说,您会收到一些零散的信息,我会使用一个简单的复合字符串键 until/unless 您对该解决方案有性能问题,然后看看尝试在你的目标引擎上获得连续的数组(将这些负索引转换成其他东西,这可能会有问题)。我怀疑您会发现查找是所有瓶颈。
您可以使用数组表示法:
var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject
对象键不能是数组,因此在后台 [5,-2]
将被字符串化为 "5,-2"
。但我认为使用数组表示法比手动字符串化更漂亮。
我有两个号码 javascript。
它们是积分坐标。
我还有一个对象:var regions = {};
我希望能够尽快访问特定对象。
例如在 (5,-2)
处可能有一个对象为这样的两个数字创建不冲突的唯一哈希值的快速方法是什么?
示例:
var regions = {
'5,-2': { ... },
'1,3': { ... }
};
然后,如果您有 2 个数字,您可以轻松生成密钥并访问相应的对象:
var x = 5;
var y = -2;
var obj = regions[x + ',' + y];
我使用了两个函数 encode
和 decode
。
var x = 10;
var y = -3.2;
function encode(x, y) {
return x + ',' + y;
}
function decode(code) {
var xy = code.split(',');
return [+xy[0], +xy[1]];
}
var code = encode(x, y);
console.log(code);
var xy = decode(code);
console.log(xy);
code
可以作为字典键值。
我假设您要访问的 "specific objects" 被 regions
上的属性引用。 JavaScript 中的对象属性由字符串名称或 Symbol
名称命名。在这种情况下,您将使用字符串。
因为它是按字符串来的,所以简单的解决方案就是创建一个字符串,然后用它来查找:
var obj = regions[num1 + "," + num2];
这让 JavaScript 引擎能够很好地查找 属性。 JavaScript 引擎在这方面非常好(阅读:快速),因为他们必须很多。
引擎如何进行查找在某种程度上取决于 regions
对象的创建方式。在可能的情况下,现代引擎将创建有效微型 类 的对象,并提供非常快速的 属性 名称解析。如果你做了某些事情(比如在其中一个属性上使用 delete
),现代引擎可能会退回到 "dictionary" 模式,它使用散列查找。这仍然很快,只是不如优化后的形式快。
我怀疑您会找到更快的方法。理论上,如果 region
是一个连续数组,其中元素引用连续数组,则 JavaScript 引擎可以隐藏这些真实数组,并且您的示例数字之一是负数,这将阻止真实数组正在使用。而且您仍然会进行两次查找(第一个数字,然后是第二个),并且不能保证它会更快。肯定会更复杂。
正如您所说,您会收到一些零散的信息,我会使用一个简单的复合字符串键 until/unless 您对该解决方案有性能问题,然后看看尝试在你的目标引擎上获得连续的数组(将这些负索引转换成其他东西,这可能会有问题)。我怀疑您会发现查找是所有瓶颈。
您可以使用数组表示法:
var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject
对象键不能是数组,因此在后台 [5,-2]
将被字符串化为 "5,-2"
。但我认为使用数组表示法比手动字符串化更漂亮。