我试着学习更多关于boost和sha1的知识。我编写了下面的代码来测试输出。除了boost之外,我还安装了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();
}Boost输出
哈希:沙哈希83008267
沙六角4f29b0b
沙散列d107070c
沙六角d107070c
沙散753
沙六角753塞德b
沙散列2adb54bf
沙六角2adb54bf
沙散列6c0fdc93
沙六角6c0fdc93
sha1 4f29b0bd107070c753cedeb2adb54bf6c0fdc93
我们还可以使用openssl库检查sha1的输出,也可以使用下面的命令。
命令 echo -n "te99999“\ openssl sha1
openssl输出::(stdin)= 04f29b0bd107070c753cedeb2adb54bf6c0fdc93
在这里,在boost sha1中缺少了领先的零。
我无法理解为什么会失踪。
发布于 2019-12-21 14:44:23
这不是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参数。它提供了.size()和.c_str()方法来获取字符串长度(没有空终止符)和指向以空结尾的C样式字符串的指针。
另外:使用detail命名空间中指定的内容通常不是一个好主意。detail通常意味着它包含的是不打算由库用户使用的实现细节。
https://stackoverflow.com/questions/59436908
复制相似问题