我需要从两个浮点向量生成一个哈希值,从一个方向矩阵中提取。为此,我使用了以下代码:
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)
中发生变化,因此哈希值不等于之前的值。
我知道直接浮点值比较不正确,所以问题是:
使哈希形成两个浮点向量的最佳方法是什么?
答案 0 :(得分:0)
从浮点向量生成哈希值很简单。 std::hash
专门用于float
。将其用于每个元素,并将它们与散列组合函数组合使用。标准库中没有这样的功能,但是增强确实并且它不依赖于boost中的任何其他功能,因此如果您不想使用其余的增强功能,则可以轻松复制它。它是this answer中的副本。
问题在于浮点运算具有精度问题所以大部分时间我对向量进行直接和反向运算时,哈希数正在发生变化。
如果原始值发生变化,甚至是最小值,则哈希值完全不同。这是散列函数的理想属性。如果这对您来说是个问题,那么您就不会使用哈希。