首先我要说的是我对 C++ 一无所知,我用 google 搜索了一下,没有任何东西可以让我理解如何在 C++ 中使用 SHA1。虽然找到了这个目标 C:SHA1 但它是关于目标 c 我不确定它是否相同。
我需要执行以下操作:
我有很多文件,我通过执行 ./make.sh 来编译它们,在一个名为 server.cpp 的文件中,我需要对这部分中插入的 SHA1 info_hash 进行加密:
Csql_query(m_database, "insert into @files (info_hash, mtime, ctime)
values (?, unix_timestamp(), unix_timestamp())").p(i.first).execute();
所以我觉得我需要执行以下 sha1(?)。 “?”不是我需要的 info_hash 。我认为它会在某个地方生成“?”是一个变量。
所以请不要告诉我添加任何类或其他东西,因为我不明白如何做到这一点,如果我需要在文件的开头添加一些东西,请告诉我。
cryptopp是一个很好的 SHA1 和其他函数库。
这是另一个问题,答案是 cryptopp:Fast Cross-Platform C/C++ Hashing Library
看起来
.p(i.first)
部分已经将 i.first
的值替换为查询中的 ?
。据推测 i.first
将是适合 info_hash
列的值。
在没有看到更多代码的情况下,无法确定。
这是一个实现 SHA1() 的库 - 可能有更好的库,即更高效的库,但这对如何使用它有一个很好的解释。
如果您想计算文件的 SHA1,可以使用 Microsoft 实用程序。
如果您有(仅标头)Boost (v1.68+) 可用,则 uuid 内有 SHA1 实现:
#include <boost/uuid/detail/sha1.hpp>
#include <iomanip>
#include <iostream>
#include <sstream>
std::string sha1(const std::string& input) {
boost::uuids::detail::sha1 sha1;
sha1.process_bytes(input.data(), input.size());
unsigned int digest[5];
sha1.get_digest(digest);
std::ostringstream hash;
hash << std::hex << std::setfill('0');
for (size_t i = 0; i < 5; ++i) {
// Swap byte order because of Little Endian
const char* tmp = reinterpret_cast<char*>(digest);
hash << std::setw(2) << static_cast<int>(static_cast<uint8_t>(tmp[i * 4 + 3]))
<< std::setw(2) << static_cast<int>(static_cast<uint8_t>(tmp[i * 4 + 2]))
<< std::setw(2) << static_cast<int>(static_cast<uint8_t>(tmp[i * 4 + 1]))
<< std::setw(2) << static_cast<int>(static_cast<uint8_t>(tmp[i * 4]));
}
return hash.str();
}
int main() {
std::cout << sha1("cat") << std::endl;
// output: 9d989e8d27dc9e0ec3389fc855f142c3d40f0c50
}