Javascript 组合两个数的具有唯一结果的Slim算法
我有一个向量类,有两个双分量,精度高达小数点后第三位,每秒实例化10亿次。Javascript 组合两个数的具有唯一结果的Slim算法,javascript,math,hash,Javascript,Math,Hash,我有一个向量类,有两个双分量,精度高达小数点后第三位,每秒实例化10亿次。 我计算它们的长度的次数也差不多。 现在我想把长度存储在内存中,我认为像HashMap/字典这样的东西是个好主意,但这意味着我需要一个键。所以我想:为什么不使用向量分量呢。因为我不能有两个键,所以我正在寻找一种方法将这两个数字组合在一起(顺序显然不重要),并得到一个唯一的结果 我的一个朋友建议使用MD5,但我认为这可能有点过分(我从没想过我会这样说MD5)。简单地将这两个值连接起来?所以使用128位键,前64位是第一个双精
我计算它们的长度的次数也差不多。
现在我想把长度存储在内存中,我认为像HashMap/字典这样的东西是个好主意,但这意味着我需要一个键。所以我想:为什么不使用向量分量呢。因为我不能有两个键,所以我正在寻找一种方法将这两个数字组合在一起(顺序显然不重要),并得到一个唯一的结果
我的一个朋友建议使用MD5,但我认为这可能有点过分(我从没想过我会这样说MD5)。简单地将这两个值连接起来?所以使用128位键,前64位是第一个双精度键,第二个64位是第二个双精度键 根据您使用的语言,您也可以使用对象/结构/任何东西作为键
不过,您的内存使用量将是巨大的。只是将这两个值串联起来?所以使用128位键,前64位是第一个双精度键,第二个64位是第二个双精度键 根据您使用的语言,您也可以使用对象/结构/任何东西作为键
不过,您的内存使用量将是巨大的。正如您所说,md5感觉相当多余。有很多简单的散列函数,例如,XOR散列对于低级的东西来说是很常见的
unsigned xor_hash ( void *key, int len )
{
unsigned char *p = key;
unsigned h = 0;
int i;
for ( i = 0; i < len; i++ )
h ^= p[i];
return h;
}
无符号异或散列(void*键,int len)
{
无符号字符*p=键;
无符号h=0;
int i;
对于(i=0;i
但是,如果性能很重要,您应该搜索对您的数据类型性能良好的校验和。没有黄金答案
有很多替代方案,它们都很容易实现和测试。您还可以测试校验和的长度,看看校验和的长度对应用程序其他部分的影响有多大(性能方面)。正如您所说,md5感觉太过分了。有很多简单的散列函数,例如,XOR散列对于低级的东西来说是很常见的
unsigned xor_hash ( void *key, int len )
{
unsigned char *p = key;
unsigned h = 0;
int i;
for ( i = 0; i < len; i++ )
h ^= p[i];
return h;
}
无符号异或散列(void*键,int len)
{
无符号字符*p=键;
无符号h=0;
int i;
对于(i=0;i
但是,如果性能很重要,您应该搜索对您的数据类型性能良好的校验和。没有黄金答案
有很多替代方案,它们都很容易实现和测试。您还可以试验校验和的长度,以了解校验和的长度对应用程序其他部分的影响(性能方面)。有点“蛮力”,但连接字符串表示如何?如果将数字强制设置为小数点后3位,则12.23和100.1将为12.230100.100
唯一的缺点是转换为字符串需要很多时间——我认为这比DThoughts建议的将双值串联起来要多。您可以对此进行测试。有点“蛮力”,但是连接字符串表示如何?如果将数字强制设置为小数点后3位,则12.23和100.1将为12.230100.100
唯一的缺点是转换为字符串需要很多时间——我认为这比DThoughts建议的将双值串联起来要多。你可以测试一下。向量中的数字是什么类型?“把这两个数字放在一起”这是二维向量?向量中的数字是什么类型?“把这两个数字放在一起”这是二维向量?