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

C++ 从两个浮点向量生成哈希的最佳方法,c++,qt,hash,C++,Qt,Hash,我需要从两个从方向矩阵中提取的浮点向量生成一个散列。为此,我使用了以下代码: QByteArray hashNumber(6*sizeof(float), Qt::Uninitialized); QVector3D vect1 = getVectorN(); QVector3D vect2 = getVectorO(); float* floatNumbers = (float*)hashNumber.data(); floatNumbers[0] = vect1.x(); floatNumb

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

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
vector具有值
(0,0,5.4878049)
,并对应于某个对象位置。当我来回移动它时,
vect1
值在最后几位发生变化
(0,0,5.4878048)
,因此哈希值不等于前面的值。 我知道直接比较浮点值是不正确的,所以问题是:


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

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

问题是,浮点运算有精度问题,所以大多数时候,当我对向量进行一些正反运算时,哈希数是变化的


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

您将如何使用该哈希值?毕竟,哈希通常用于相等比较,正如您所知,比较浮点相等通常是不正确的。我使用它进行相等比较,但是正如您所注意到的,由于不正确的浮点比较,它提供了不稳定的结果。这就是为什么我会问,有没有克服这个问题的通用方法?我的观点是,这个问题通常不存在,因为哈希浮动没有用例。解决方案是不比较浮点数是否相等。由于不比较浮点数是否相等,因此不需要对它们进行散列。我猜你在处理这个问题,你能在这一部分再详细阐述一下吗:“当我来回移动它的时候”?我的物体是可以在空间中平移的平面。假设vect2是指定平面位置的平移向量。每个vect2组件限制在[0,1]范围内。当我在空间中移动平面(不改变方向)时,只有vect2向量改变。我可以把它移到某个三角形上,然后移回到同一个三角形上。