在C++中使用Libmd5计算字符串或文件的MD5值

CppMD5Demo.cpp

#include <iostream>
#include <fstream>
#include <chrono>
#include "MessageDigest5.h"
#define INPUT_BUFFER_SIZE 1024
int main(int argc, const char **argv)
{
    if (argc < 3)
        std::cout << "Usage: CppMD5Demo [options] <param>\nOptions:\n  -string <string>\n  -file <filename>" << std::endl;
    else
    {
        if (!std::strcmp(argv[1], "-string"))
        {
            const std::chrono::system_clock::time_point &startTime = std::chrono::system_clock::now();
            MessageDigest5 md5;
            md5.appendData(argv[2], std::strlen(argv[2]));
            const std::string &md5String = md5.result();
            const std::chrono::system_clock::time_point &endTime = std::chrono::system_clock::now();
            const std::chrono::duration<float, std::ratio<1, 1>> &elapseTime = endTime - startTime;
            std::cout << "MD5 hashed: " << md5String << ", elapsed time: " << elapseTime.count() << " seconds." << std::endl;
        }
        else if (!std::strcmp(argv[1], "-file"))
        {
            std::ifstream ifs(argv[2], std::ifstream::binary);
            if (ifs.is_open())
            {
                std::cout << "MD5 hashing..." << std::endl;
                const std::chrono::system_clock::time_point &startTime = std::chrono::system_clock::now();
                MessageDigest5 md5;
                char buffer[INPUT_BUFFER_SIZE];
                while (!ifs.eof())
                {
                    std::streamsize numberOfCharacters = ifs.read(buffer, INPUT_BUFFER_SIZE).gcount();
                    md5.appendData(buffer, numberOfCharacters);
                }
                const std::string &md5String = md5.result();
                const std::chrono::system_clock::time_point &endTime = std::chrono::system_clock::now();
                const std::chrono::duration<float, std::ratio<1, 1>> &elapsedTime = endTime - startTime;
                std::cout << "MD5 hashed: " << md5String << ", elapsed time: " << elapsedTime.count() << " seconds." << std::endl;
            }
            else
                std::cout << "Cannot open file: " << argv[2] << std::endl;
        }
        else
            std::cout << "Usage: CppMD5Demo [options] <param>\nOptions:\n  -string <string>\n  -file <filename>" << std::endl;
    }
    return 0;
}

 

MessageDigest5.h

#pragma once
#include <string>
#include "libmd5/md5.h"
class MessageDigest5
{
public:
    MessageDigest5();
    void appendData(const char *data, size_t dataSize);
    std::string result();
private:
    md5_state_t md5State;
};

 

MessageDigest5.cpp

#include "MessageDigest5.h"
MessageDigest5::MessageDigest5()
{
    md5_init(&md5State);
}
void MessageDigest5::appendData(const char *data, size_t dataSize)
{
    md5_append(&md5State, reinterpret_cast<const md5_byte_t *>(data), dataSize);
}
std::string MessageDigest5::result()
{
    unsigned char digest[16];
    md5_finish(&md5State, digest);
    std::string md5String;
    char hexBuffer[3];
    for (size_t i = 0; i != 16; ++i)
    {
        if (digest[i] < 16)
            sprintf(hexBuffer, "0%x", digest[i]);
        else
            sprintf(hexBuffer, "%x", digest[i]);
        md5String.append(hexBuffer);
    }
    return md5String;
}

 

关于libmd5,可参考使用C语言获取字符串或文件的MD5值

转载于:https://www.cnblogs.com/buyishi/p/9100257.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值