Лучший способ сделать хеш из двух векторов с плавающей точкой

Мне нужно сгенерировать хеш из двух векторов с плавающей точкой, извлеченных из матрицы ориентации. Для этого я использовал следующий код:

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)следовательно, значение хеша не равно предыдущему. Я знаю, что прямое сравнение значений с плавающей точкой не является правильным, поэтому вопрос:

Каков наилучший способ сделать хеш из двух плавающих векторов?

1 ответ

Генерировать значение хеша из вектора чисел с плавающей запятой просто. std::hash специализируется на float, Используйте это для каждого элемента и объедините их с помощью функции хеширования. В стандартной библиотеке такой функции нет, но boost делает это и не зависит от чего-либо еще в boost, поэтому вы можете просто скопировать ее, если не хотите использовать остальную часть boost. В этом ответе есть копия этого.

Проблема в том, что у арифметики с плавающей запятой есть проблемы с точностью, поэтому большую часть времени, когда я делаю некоторую прямую и обратную операцию над векторами, число хешей меняется.

Если исходное значение изменяется, хотя бы минимально, тогда значение хеша будет совершенно другим. Это желаемое свойство хэш-функции. Если это проблема для вас, то вы не должны использовать хеширование.

Другие вопросы по тегам