uint32_t Seed() {
uint64_t seed = GetSomeReasonable64BitIntegerSeed();
return *(uint32_t*)&seed ^ *((uint32_t*)&seed + 1);
}
上面不是真正的代码,但这基本上是真正的代码所做的。我从g ++那里得到一个警告,它违反了严格的别名,谷歌搜索它,好吧我想解决它。我发现了this问题,但除了使用memcpy
或依赖于未定义但实际上没有问题的行为之外,它没有提供明确的解决方案,即访问联合的未设置成员。
我能想到的当前选择是,
memcpy
。union
并将此部分编译为C,其中语言标准允许通过工会进行类型惩罚。答案 0 :(得分:8)
逐位算术定义明确,可能更有效。对于这个例子:
return seed ^ (seed >> 32);