首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同输入的boost sha1和openssl库的不同输出

相同输入的boost sha1和openssl库的不同输出
EN

Stack Overflow用户
提问于 2019-12-21 14:16:01
回答 1查看 311关注 0票数 0

我试着学习更多关于boost和sha1的知识。我编写了下面的代码来测试输出。除了boost之外,我还安装了openssl库。

我编写了下面的代码,在openssl和boost sha1中,我得到了相同值的不同值。

inpur字符串:"te99999"

代码语言:javascript
复制
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中缺少了领先的零。

我无法理解为什么会失踪。

EN

回答 1

Stack Overflow用户

发布于 2019-12-21 14:44:23

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

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

代码语言:javascript
复制
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通常意味着它包含的是不打算由库用户使用的实现细节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59436908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档