Javascript散列两个数字

Javascript散列两个数字,javascript,hash,lookup,Javascript,Hash,Lookup,我有两个javascript数字 它们是积分坐标 我还有一个对象:var regions={} 我希望能够尽快访问特定对象 例如,(5,-2)处可能有一个物体 对于这样的两个数字,如何快速创建不冲突的唯一哈希?示例: var regions = { '5,-2': { ... }, '1,3': { ... } }; 然后,如果您有2个数字,您可以轻松生成密钥并访问相应的对象: var x = 5; var y = -2; var obj = regions[x + ',' +

我有两个javascript数字

它们是积分坐标

我还有一个对象:
var regions={}

我希望能够尽快访问特定对象

例如,(5,-2)处可能有一个物体

对于这样的两个数字,如何快速创建不冲突的唯一哈希?

示例:

var regions = {
    '5,-2': { ... },
    '1,3': { ... }
};
然后,如果您有2个数字,您可以轻松生成密钥并访问相应的对象:

var x = 5;
var y = -2;
var obj = regions[x + ',' + y];
例如:

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
可以用作dict键值。

我使用了两个功能
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
可以用作dict键值。

我假设要访问的“特定对象”由
区域上的属性引用。JavaScript中的对象属性通过字符串名称或
Symbol
名称命名。在这种情况下,您将使用字符串

因为它将是按字符串进行的,所以简单的解决方案是创建一个字符串,并使用以下内容进行查找:

var obj = regions[num1 + "," + num2];
这就让JavaScript引擎能够很好地查找属性。JavaScript引擎在这方面做得非常好,因为它们必须做很多事情

引擎如何进行查找在某种程度上取决于
区域
对象的创建方式。只要有可能,现代引擎将创建有效的微类对象,并提供非常快速的属性名称解析。如果您执行某些操作(例如对其中一个属性使用
delete
),现代引擎可能会退回到“dictionary”模式,在该模式下使用哈希查找。这仍然很快,只是没有优化表单快

我怀疑你能找到一个更快的方法。理论上,如果
region
是一个连续数组,其中元素引用了连续数组,那么JavaScript引擎可以将这些真实数组隐藏起来,并且您的一个示例数字为负数,这将阻止使用真实数组。你仍然会做两次查找(第一个数字,然后是第二个),但不能保证它会更快。这肯定会更加复杂

正如您所说的那样,您将一点一滴地接收信息,我将使用一个简单的复合字符串键,直到/除非您的解决方案出现性能问题,然后查看如何在目标引擎上实现连续数组(将这些负索引转换为其他索引,这可能会有问题)。我怀疑您是否会发现查找是每个瓶颈。

我假设您要访问的“特定对象”由
区域上的属性引用。JavaScript中的对象属性通过字符串名称或
Symbol
名称命名。在这种情况下,您将使用字符串

因为它将是按字符串进行的,所以简单的解决方案是创建一个字符串,并使用以下内容进行查找:

var obj = regions[num1 + "," + num2];
这就让JavaScript引擎能够很好地查找属性。JavaScript引擎在这方面做得非常好,因为它们必须做很多事情

引擎如何进行查找在某种程度上取决于
区域
对象的创建方式。只要有可能,现代引擎将创建有效的微类对象,并提供非常快速的属性名称解析。如果您执行某些操作(例如对其中一个属性使用
delete
),现代引擎可能会退回到“dictionary”模式,在该模式下使用哈希查找。这仍然很快,只是没有优化表单快

我怀疑你能找到一个更快的方法。理论上,如果
region
是一个连续数组,其中元素引用了连续数组,那么JavaScript引擎可以将这些真实数组隐藏起来,并且您的一个示例数字为负数,这将阻止使用真实数组。你仍然会做两次查找(第一个数字,然后是第二个),但不能保证它会更快。这肯定会更加复杂


正如您所说的那样,您将一点一滴地接收信息,我将使用一个简单的复合字符串键,直到/除非您的解决方案出现性能问题,然后查看如何在目标引擎上实现连续数组(将这些负索引转换为其他索引,这可能会有问题)。我怀疑您是否会发现查找是每个瓶颈。

您可以使用数组表示法:

var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject

对象键不能是数组,因此引擎盖下的
[5,-2]
将被字符串化为
“5,-2”
。但我认为使用数组表示法比手动字符串化更漂亮。

您可以使用数组表示法:

var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject

对象键不能是数组,因此引擎盖下的
[5,-2]
将被字符串化为
“5,-2”
。但我认为使用数组表示法比手动字符串化更漂亮。

如何创建
区域
?这是一个网络应用程序,所以这些区域通过WebSocket发送。它们将是阵列中的多个组。例如,一组区域可能在(0,0)左右,另一组可能在(500,20)左右等等。因此,您是否收到您解析的一条重要消息,或点点滴滴?@T.J.Crowder点点滴滴。一次发送一个包含坐标的对象,然后存储。注意:在一般计算机科学术语中,“不是唯一的,只是可复制的(即,相同的值总是产生相同的散列,但两个不同的值可能产生相同的散列)。使用此定义,
x^y
是一个完全有效的散列。如何创建
区域?一点也不