升压sha1的不同输出和相同输入的openssl库



我试图了解更多关于boost和sha1的信息。我在下面编写了代码来测试输出。除了提升,我还安装了openssl库。
我已经写了下面的代码,我在 openssl 和 boost sha1 中为相同的值获得了不同的值。
Inpur 字符串:"TE99999">

std::string makeSHA1boostV1(const char text[])
{
boost::uuids::detail::sha1 sha1;
unsigned int hash[5];
sha1.process_bytes(text, sizeof(text)-1);
sha1.get_digest(hash);
std::ostringstream buf;
std::cout << "Hash: ";
for(std::size_t i=0; i<sizeof(hash)/sizeof(hash[0]); ++i) {
std::cout <<"sha hash "<<hash[i]<<std::endl;
std::cout << std::hex <<hash[i];
buf << std::hex <<hash[i];
}
std::cout << std::endl;
std::cout << "sha1  "<<buf.str()<<std::endl;
return buf.str();
}

升压输出
散 列: 沙哈希83008267
沙六角 4F29B0B
SHA 哈希 D107070C
SHA 六角 D107070C
SHA 哈希 753CEDEB
沙十六进制 753塞德布
SHA 哈希 2ADB54BF
SHA 十六进制 2ADB54BF
SHA 哈希 6C0fdc93
SHA 六角 6C0FDC93

SHA14F29B0BD107070C753CEDEB2ADB54BF6C0FDC93

我们还可以使用以下命令使用 openssl 库检查 sha1 的输出。
命令echo -n "TE99999" | openssl sha1
OpenSSL 输出:: (标准定(= 04F29B0BD107070C753CEDEB2ADB54BF6C0FDC93

此处,升压 sha1 中缺少前导
我无法理解为什么缺少0

这不是 boost 的问题,而是您使用流的问题。

默认情况下,使用<<打印数字将丢弃前导零。 如果您不希望这样做,则需要指定:

buf << std::hex << std::setfill('0') << std::setw(sizeof(hash[i])*2) << hash[i];

等同于std::cout.


此外,您使用指针错误。text是指向const char的指针。因此,sizeof(text)是指针类型的大小,而不是text指向的数组的大小。它碰巧在问题中的示例中起作用,因为输入字符串(包括 null 终止符(的长度恰好是8,这是 64 位系统上指针的大小。

您可以使用std::strlen获取 C 样式以 null 结尾的字符串的长度。(需要#include<cstring>(

或者,更好的是,将const std::string&而不是const char*作为text参数。它提供了.size().c_str()方法来获取字符串长度(不带 null 终止符(和指向以 null 结尾的 C 样式字符串的指针。


另外:使用在detail命名空间中指定的内容通常不是一个好主意。detail通常意味着它包含的内容是实现细节,不打算由库用户使用。

最新更新