#pragma once
#include <string>
#include <vector>
#include <cstdint>

class Hash
{
public:
	/// <summary>
	/// 计算文件的 MD5 哈希，返回 32 字符的十六进制字符串。
	/// 失败返回空字符串。
	/// </summary>
	static std::string ComputeMD5(const std::string& filePath);

	/// <summary>
	/// 计算字节数据的 MD5 哈希。
	/// </summary>
	static std::string ComputeMD5(const std::vector<uint8_t>& data);

	/// <summary>
	/// 计算字符串的 MD5 哈希。
	/// </summary>
	static std::string ComputeMD5String(const std::string& str);

	/// <summary>
	/// 计算字符串的 SHA-256 哈希，返回 64 字符的十六进制字符串。
	/// </summary>
	static std::string ComputeSHA256String(const std::string& str);

	/// <summary>
	/// 比较两个文件是否相同（先比大小，再比 MD5）。
	/// </summary>
	static bool CompareFiles(const std::string& path1, const std::string& path2);

	/// <summary>
	/// 比较磁盘文件与内存数据是否相同（先比大小，再比 MD5）。
	/// </summary>
	static bool CompareFileWithMemory(const std::string& filePath, const std::vector<uint8_t>& memData);

	/// <summary>
	/// 获取文件大小，失败返回 -1。
	/// </summary>
	static int64_t GetFileSize(const std::string& filePath);

private:
	Hash() = default;
	~Hash() = default;
};
