c - 对于相同的值,double 中的字节散列是否始终相同?

标签 c hash double normalization

我想我的问题也可以这样问:一个十进制值能否在 double 变量中以多种方式表示。

我有一个哈希表实现, double float 将是键,我正在使用一种哈希算法,该算法在迭代 double 的每个字节时构建哈希(至少在我的系统上是 64-位,所以要散列 8 个字节)。我的问题是,如果单个值(例如“1.2345”)可以以二进制形式以双倍多于 1 的方式表示,那么它可能会导致单个值的多个可能的哈希值。

我不确定去哪里研究这种可能性。如果我不得不猜测,我会猜测这是不可能的,或者如果可能的话,某些东西会对其进行规范化以确保值在给定系统上始终具有相同的表示形式。我主要是想确认这一点。

如果一个值可以有多种表示形式,那么我需要在对其进行哈希处理之前对该值进行规范化,我很乐意就如何做到这一点提出建议。

编辑:

我发现了更多关于 float 的知识。它们被存储为一个尾数和一个指数。所以我的问题是一个 float 是否可以由多个尾数和指数的组合来表示。

最佳答案

float 的逐字节散列会遇到两个问题。

第一个出乎意料地经常出现的是 0 有两种表示形式,一种具有每个可能的符号位。 (0 和负 0。)它们不仅在数学上相等,而且需要在 C/C++ 中测试相等。负数 0 在计算中经常出现,尽管并非所有 printf 都将其打印为 -0。 (至少在 Intel 硬件上,0.0/-1.0 是 -0.0。)

因此,您需要确保两个零哈希值相同。

另一个问题是 NaN。有很多 NaN,但它们(在技术上)甚至无法与它们自身相比较,因此它们会产生糟糕的哈希键。可能最简单的解决方案是忽略它们,因为没有人应该期望 NaN 可用作哈希键。但问题是,如果有人试图将一个放入您的哈希表,然后再次放入,如果您使用浮点 == 来检查 key 存在,它可能最终会被输入两次.因此,一个简单的错误(或蓄意攻击)可能会通过扩展哈希表来快速耗尽内存。 (如果用memcmp对比bytes,就不会有这个问题。)

关于c - 对于相同的值,double 中的字节散列是否始终相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19016930/

相关文章:

c - 为什么if语句不考虑 "OR(s)"

c - c程序中的隐藏错误(数值计算)

javascript - nodejs - 如何比较bcrypt的两个哈希密码

algorithm - 生产中md5碰撞的几个问题

Java 双重溢出

计算 c 中的问题(visual studio)

c - 如何将字符数组连接成单个字符串?

hash - 对 Web 服务的密码加盐的原因

java - 数字文字末尾的 F 和 D 是什么意思?

c# - 32 位和 64 位操作系统中的双字节大小