从两个浮点向量生成哈希的最佳方法

Best way to make a hash from two float vectors

本文关键字:哈希 方法 最佳 向量 两个      更新时间:2023-10-16

我需要从方向矩阵中提取的两个浮点向量生成一个哈希。为此,我使用了以下代码:

QByteArray hashNumber(6*sizeof(float), Qt::Uninitialized);
QVector3D vect1 = getVectorN();
QVector3D vect2 = getVectorO();
float* floatNumbers = (float*)hashNumber.data();
floatNumbers[0] = vect1.x();
floatNumbers[1] = vect1.y();
floatNumbers[2] = vect1.z();
floatNumbers[3] = vect2.x();
floatNumbers[4] = vect2.y();
floatNumbers[5] = vect2.z();

问题是浮点运算有精度问题,所以大多数时候,当我对向量进行直接和反向运算时,哈希数都在变化。

例如,假设vect1向量的值为(0, 0, 5.4878049),并且对应于某个对象位置。当我来回移动它时,vect1的值在最后几位(0, 0, 5.4878048)中发生变化,因此哈希值不等于前一位。我知道直接比较浮点值是不正确的,所以问题是:

使hash形成两个浮点向量的最佳方法是什么?

从浮点向量生成哈希值很简单。CCD_ 5专用于CCD_ 6。将其用于每个元素,并将它们与哈希组合函数组合。标准库中并没有这样的函数,但boost有,而且它不依赖于boost中的任何其他函数,所以如果您不想使用boost的其余部分,您可以简单地复制它。这个答案里有一份。

问题是浮点运算有精度问题,所以大多数时候,当我对向量进行直接和反向运算时,哈希数都在变化。

如果原始值发生了变化,即使是最小的变化,那么哈希值也完全不同。这是散列函数的一个可取属性。如果这对你来说是个问题,那么你就不应该使用哈希。