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];

我使用了两个函数 encodedecode

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"。但我认为使用数组表示法比手动字符串化更漂亮。