【问题标题】:What is the mathematical meaning of swap high part and low part of a uint64_t?交换uint64_t的高部分和低部分的数学含义是什么?
【发布时间】: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


【解决方案1】:

在维基百科上的pseudocode 中表示 SHA256

预处理:将位'1'附加到消息附加k位'0', 其中 k 是最小数字 >= 0 使得生成的消息 长度(以位为模 512)为 448。附加消息长度(不带“1”位或填充),以位为单位,为 64 位大端 整数 (这将使整个后处理长度成为 512 位的倍数)

x86/x86_64 Linux 和 Unix 是小端。

它将消息的长度转换为大端序以将其添加到消息的末尾,它在 sha256.c 的 L105 的源代码中执行此操作,并且该代码部分是 @987654323 的唯一位置@函数被调用:

https://github.com/noryb009/sha256/blob/77a185c837417ea3fc502289215738766a8f8046/sha256.c#L100

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2016-05-11
    • 2015-06-03
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多