SHA-256的双分部分的十六进制表示
Hexadecimal representation of double fractional part for SHA-256
我正在尝试编写sha-256哈希函数以进行练习。在Wikipedia中,初始哈希值由前8个素数2..19的平方根的分数给出。现在,我正在尝试计算它们。到目前为止,我已经做了什么:
#include <vector>
#include <cstdint>
#include <cmath>
#include <cstdio>
// fill primes with all prime values between min and max value
int getPrimes(uint32_t min, uint32_t max, std::vector<uint32_t>* primes)
{
if (min < 1) min = 1; // primes can only be >= 1
if (min > max) return 0; // max has to be larger than min
for (uint32_t value = min; value <= max; value++)
{
uint32_t tmp;
for (tmp = 2; tmp <= sqrt(value); tmp++) // start to check with 2, because 1 is always going to work
{
if (value % tmp == 0)
{
break;
}
}
if (tmp > sqrt(value)) primes->push_back(value); // if no other integer divisor is found, add number to vector
}
return 0;
}
int main()
{
std::vector<uint32_t> primes;
getPrimes(2, 20, &primes); // fills vector with all prime values between 2 and 20
double tmp = sqrt(primes[0]); // get square root, returns double
printf("value %fn", tmp); // debug
printf("size of double %in", sizeof(double)); // get representation byte size
double * tmpOffset = &tmp; // get value offset
unsigned char * tmpChar = (unsigned char*)tmpOffset; // convert to char pointer
printf("address of variable %in", &tmp); // debug
printf("raw valuesn1:%Xn2:%Xn3:%Xn4:%Xn5:%Xn6:%Xn7:%Xn8:%Xn",
(uint8_t)tmpChar[0], (uint8_t)tmpChar[1], (uint8_t)tmpChar[2], (uint8_t)tmpChar[3],
(uint8_t)tmpChar[4], (uint8_t)tmpChar[5], (uint8_t)tmpChar[6], (uint8_t)tmpChar[7]);
return 0;
}
这返回前8个素数,计算2的平方根,并直接从存储实际字节值的内存位置获取:
value 1.414214
size of double 8
address of variable 6881016
raw values
1:CD
2:3B
3:7F
4:66
5:9E
6:A0
7:F6
8:3F
与Wikipedia文章0x6a09e667
中给出的价值相比,我在这里做的事很大。是否发生重新映射或双重二进制重新启动?
编辑:感谢您的帮助!它不是很漂亮,但现在可以工作。
printf("raw fractional part:n0x%02X %02X %02X %02X %02X %02X %02Xn",
(uint8_t)(0xf & tmpChar[6]), (uint8_t)tmpChar[5], (uint8_t)tmpChar[4], (uint8_t)tmpChar[3],
(uint8_t)tmpChar[2], (uint8_t)tmpChar[1], (uint8_t)tmpChar[0]);
uint32_t fracPart = (0xf & tmpChar[6]);
fracPart <<= 8;
fracPart |= tmpChar[5];
fracPart <<= 8;
fracPart |= tmpChar[4] ;
fracPart <<= 8;
fracPart |= tmpChar[3];
fracPart <<= 4;
fracPart |= (0xf0 & tmpChar[2]) >> 4;
printf("fractional part: %Xn", fracPart);
edit2 更好的实现:
uint32_t fracPart2 = *(uint32_t*)((char*)&tmp + 3); // point to fractional part - 4 bit
fracPart2 <<= 4; // shift to correct value
fracPart2 |= (0xf0 & *((char*)&tmp + 2)) >> 4; // append last 4 bit
printf("beautiful fractional part: %Xn", fracPart2);
此解决方案高度依赖于平台,在第二种方法中,我要在评论2的链接中进行类似的内容。
edit3
因此,这是我的最终解决方案,它不取决于双重的内部表示,并仅使用数学计算分数。
uint32_t getFractionalPart(double value)
{
uint32_t retValue = 0;
for (uint8_t i = 0; i < 8; i++)
{
value = value - floor(value);
retValue <<= 4;
value *= 16;
retValue += floor(value);
}
return retValue;
}
要记住的一件事是,这里的双重是64位。如果您在下面的链接中查看双打的IEEE表示,则它具有1个符号位,11个指数位,其余是精度位。
现在,当您查看您获得的输出时,请看一下我在报价中放的nibbles,它们看起来很熟悉吗?该数字倒退的原因是由于底色。第12位是在这种情况下分数零件开始的地方,然后向后移动。
1:CD
2:3B
3:'7'F
4:'66'
5:'9E'
6:'A0'
7:F'6'
8:3F
或
8:3F
7:F'6'
6:'A0'
5:'9E'
4:'66'
3:'7'F
2:3B
1:CD
https://en.wikipedia.org/wiki/double-precision_floating-point_format
相关文章:
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- C++ 将十六进制字符串表示形式转换为十六进制字符串表示形式
- 如何将由一系列十六进制值表示的枚举附加到 QByteArray?
- 十六进制 QString 表示为无符号字符数组
- 如何在 c++ 中将字节转换为 ASCII 十六进制表示形式?
- 以十六进制格式表示 fp16 最小数
- 如何转换由字符表示的十六进制值
- SHA-256的双分部分的十六进制表示
- 如何将字符串转换为十六进制表示形式
- 当传递表示负值的十六进制时,C++stoll抛出超出范围的异常
- Aho Corasick Algo在c/c++中表示十六进制
- 用十六进制表示法编写代码有什么意义
- 如何将无符号字符值表示为十六进制字符串
- 以十进制、八进制和十六进制表示法标识整数文本是否与转义字符中的整数文本相同
- 将字符串转换为Unicode十六进制表示形式,然后返回C++
- Codekata将数字从十六进制转换为十进制整数表示形式
- 将文本十六进制转换为实十六进制表示C++
- 在c++中将N位int表示为十六进制
- 如何查找给定的字符串是否符合十六进制表示法,例如不带正则表达式的0x34FF
- 以十六进制表示法(0xABCDEF)将字节缓冲区的字节输出到控制台输出流