具有唯一结果的两个数字组合的精简算法

Slim algorithm with unique result for combining two numbers

本文关键字:组合 两个 数字 算法 唯一 结果      更新时间:2023-09-26

我有一个向量类,它有两个双分量,精度达到小数点后第三位,每秒实例化十亿次。
我也计算过它们的长度。
现在我想把长度存储在内存中,我认为像HashMap/dictionary这样的东西是个好主意,但这意味着我需要一个键。所以我想,为什么不用矢量分量。因为我不能有两个键,我正在寻找一种方法把这两个数字放在一起(顺序显然不重要),并得到一个唯一的结果。

我的一个朋友建议使用MD5,但我认为这可能是多余的(我从来没有想过我会说MD5)。

简单地将两个值连接起来?所以使用128位密钥,前64位是第一个双精度,第二个64位是第二个双精度?

根据你使用的语言,你也可以使用Object/Struct/whatever作为key。

就像你说的,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;
}

但是如果性能很重要,您应该搜索对您的数据类型执行良好的校验和。没有黄金答案。

这里有许多替代方案,它们都很容易实现和测试。您还可以试验校验和的长度,以查看校验和的长度对应用程序的其他部分有何影响(性能方面)。

有点"蛮力",但是如何连接字符串表示?如果你强迫你的数字到小数点后3位,12.23和100.1将是12.230100.100

唯一的缺点是转换为字符串需要很多时间-我认为比DThoughts建议的串联双精度值更多。你可以测试一下