从两个浮点向量生成哈希的最佳方法
Best way to make a hash from two float vectors
我需要从方向矩阵中提取的两个浮点向量生成一个哈希。为此,我使用了以下代码:
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的其余部分,您可以简单地复制它。这个答案里有一份。
问题是浮点运算有精度问题,所以大多数时候,当我对向量进行直接和反向运算时,哈希数都在变化。
如果原始值发生了变化,即使是最小的变化,那么哈希值也完全不同。这是散列函数的一个可取属性。如果这对你来说是个问题,那么你就不应该使用哈希。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 给定哈希函数解码消息的最佳方法是什么
- C++,在哈希表中显示内容的方法.使用双链表
- 在C++中实现哈希旋转方法的最佳方式是什么
- 为密码哈希函数生成Salt的已接受方法-C++
- C++中的简单哈希方法
- 从两个浮点向量生成哈希的最佳方法
- C++ 哈希表使用链接、删除方法
- 我不确定这个前缀哈希方法应该做什么
- C++中的任何内置哈希方法
- 在我的情况下,我如何重载相等的方法以使不同的对象在unordered_multimap具有相同的哈希码值
- 对不太长的字符串向量 (urls) 进行哈希处理的最佳方法是什么?