[英]Different output for boost sha1 and openssl library for same input
我试图了解有关 boost 和 sha1 的更多信息。 我写了下面的代码来测试输出。 除了 boost,我还安装了 openssl 库。
我写了下面的代码,我在 openssl 和 boost sha1 中得到了相同值的不同值。
输入字符串:“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();
}
升压输出:
哈希: sha 哈希 83008267
沙六角4f29b0b
沙哈希d107070c
sha hex d107070c
沙哈希753cedeb
sha hex 753cedeb
沙哈希2adb54bf
sha hex 2adb54bf
沙哈希6c0fdc93
沙六角6c0fdc93
sha1 4f29b0bd107070c753cedeb2adb54bf6c0fdc93
我们还可以使用以下命令使用 openssl 库检查 sha1 的输出。
命令echo -n "te99999" | opensl sha1
openssl 输出:: (stdin)= 04f29b0bd107070c753cedeb2adb54bf6c0fdc93
这里 boost 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
指向的数组的大小。 它恰好在问题中的示例中起作用,因为您的输入字符串(包括空终止符)的长度恰好是8
,这是 64 位系统上指针的大小。
您可以使用std::strlen
获取 C 样式以空字符结尾的字符串的长度。 (需要#include<cstring>
)
或者,更好的是,使用const std::string&
而不是const char*
作为text
参数。 它提供了.c_str()
.size()
和.c_str()
方法来获取字符串长度(没有空终止符)和一个指向空终止 C 风格字符串的指针。
另外:使用在detail
名称空间中指定的内容通常不是一个好主意。 detail
通常意味着它包含的内容是不打算由库用户使用的实现细节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.