64,633
社区成员
发帖
与我相关
我的任务
分享
inline void InternalMD5Update(MD5_CTX* ctx, const std::string& data) {
MD5_Update(ctx, data.data(), data.size());
}
template<typename... TArgsPack>
void InternalMD5Update(MD5_CTX* ctx, const std::string& data, const TArgsPack&... args) {
InternalMD5Update(ctx, data);
InternalMD5Update(ctx, args...);
}
template<typename... TArgsPack>
std::string GetMd5(const TArgsPack&... args) {
MD5_CTX ctx;
unsigned char md5[16];
MD5_Init(&ctx);
InternalMD5Update(&ctx, args...);
MD5_Final(md5, &ctx);
return std::string(md5, sizeof(md5));
}
template<typename... TArgsPack>
std::string GetMd5(const TArgsPack&... args) {
MD5_CTX ctx;
unsigned char md5[16];
MD5_Init(&ctx);
for (const std::string& data : {args...}) {
MD5_Update(&ctx, data.data(), data.size());
}
MD5_Final(md5, &ctx);
return ConvertBytesToHexString(md5, sizeof(md5));
}
auto const f = [&](std::string const &s)
{
MD5_Update(&ctx,s.data(),s.size());
return true;
};
for (auto const& _ : {f(ts)...}) { (void)_; }
其实主楼是最简单的方法了,要想再写的简单漂亮只能依赖库的支持了,可惜 c++11 没有 static_for_each。
后面给的循环或者 list initialization 的方法无法保证编译期展开;而使用变参函数模板又不能保证求值顺序,都是以词骇意的感觉。
template<typename... TArgsPack>
std::string GetMd5(const TArgsPack&&... args) {
std::array<std::string, sizeof...(args)> arr = {std::forward<TArgsPack>(args)...};
MD5_CTX ctx;
unsigned char md5[16];
MD5_Init(&ctx);
for (std::string& data : arr)
{
MD5_Update(ctx, data, data.size());
}
MD5_Final(md5, &ctx);
return std::string(md5, sizeof(md5));
}
谢谢LS提醒~
template<typename... TArgsPack>
std::string GetMd5(const TArgsPack&&... args) {
auto inargs(std::make_tuple(std::forward<TArgsPack>(args)...);
MD5_CTX ctx;
unsigned char md5[16];
MD5_Init(&ctx);
argnum = sizeof...(inargs);
for (int i = 0; i < argnum; ++i)
{
const int id = i;
std::string data = std::get<id>(inargs);
MD5_Update(ctx, data, data.size());
}
MD5_Final(md5, &ctx);
return std::string(md5, sizeof(md5));
}
这个?