对于结构,其中相等意味着每个数据成员的最大派生类型和字节相等,如果有的话,结构是否可以安全地作为字节数组进行哈希处理?
这个文件
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3333.html
在标题"将对象作为字节数组散列"下,建议使用任何填充的结构不能作为字节数组安全地进行散列.
是否需要将结构安全地散列为字节数组的填充的显式测试?这够了吗?
如果是这样,下面的草图是否恰当地说明了该测试?
#include <cstddef>
#include <iostream>
struct A
{
int i;
float f;
char c;
};
// hashing would start at offs_i (possibly hopping over a v-table) and end at
// offs_c + sizeof(char)
int main()
{
const std::size_t size_A = sizeof(A);
const std::size_t size_int = sizeof(int);
const std::size_t size_float = sizeof(float);
const std::size_t size_char = sizeof(char);
const std::size_t offs_i = offsetof(A, i);
const std::size_t offs_f = offsetof(A, f);
const std::size_t offs_c = offsetof(A, c);
bool padded = false;
if (offs_f != size_int)
padded = true;
else if (offs_c != size_int + size_float)
padded = true;
std::cout << "padded? " << std::boolalpha << padded << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果一个结构有填充,有没有办法解决方法允许散列作为一个字节数组,例如清零填充位?
这里的"安全"意味着两个结构将相等的哈希值与相同的值进行比较.
几乎从来没有。该标准没有定义如何实现继承,例如使用虚函数表指针,因此不能保证具有相同的最派生类型的两个类将具有相同的任何特定于实现的继承相关数据。
此外,由于它们不是 POD,因此不能保证 offsetof 能够工作或产生有意义的结果 - 我相信它实际上只是普通的 UB。
总而言之,不要费心尝试将结构视为字节数组,因为它们不是。
至于他在论文中的意图,这更可能是对一些狂热的“er mah german 表演!”的让步。委员会中的狗而不是他想做的实际事情。