【发布时间】:2017-01-08 18:09:36
【问题描述】:
代码来自sha256的一个开源项目,
uint64_t swapE64(uint64_t val) {
uint64_t x = val;
x = (x & 0xffffffff00000000) >> 32 | (x & 0x00000000ffffffff) << 32;
x = (x & 0xffff0000ffff0000) >> 16 | (x & 0x0000ffff0000ffff) << 16;
x = (x & 0xff00ff00ff00ff00) >> 8 | (x & 0x00ff00ff00ff00ff) << 8;
return x;
}
函数并不复杂,但我不知道它的数学含义和用法。
我的错,我没有问得很清楚。在不同的环境中使用不同的endian表示,很明显,这个功能会保持数据的相同含义,但是在相同的endian表示下,它是什么意思呢?
它绝对会改变数据的含义,还是有其他原因要交换它?
【问题讨论】:
-
阅读 sha256 的规范,一切都会清楚。这基本上是交换 int64 的字节顺序。
-
@SamVarshavchik,我从 github 阅读了一些其他的 sha256 实现,但是没有这样的功能。
-
这个问题的一个好的答案需要知道您是否了解如何用二进制表示数字。另外,你知道字节序是什么意思吗?
-
@asimes,我知道这是交换字节并在小端和大端之间切换。如果是在不同的环境下使用不同的endian表示,我可以理解,但在相同的环境下,我不能。
-
您可能会在十进制中问自己同样的问题:反转数字的数字的数学含义是什么?也就是说,例如从 18374 更改为 47381?据我所知,除了一些全等关系(例如,这两个数字是全等 mod 9)之外,没有任何数学意义。
标签: c hash bit-manipulation sha256