[Golang]计算一个文件的MD5值

本文介绍了在Golang中如何计算文件和字符串的MD5值。通过使用`crypto/md5`包,可以实例化MD5对象并利用`sum`方法计算文件的MD5。对于已打开的文件,可以使用`io.Copy`,或者直接调用`sum`函数,虽然速度稍慢。同时,对于字符串的MD5加密,只需将字符串写入hash。

说明

在实际的开发过程中,总需要对文件进行md5加密的需求,在开发过程中,我就遇到了将表单文件MD5后再存储本地的需求。

解决

MD5的所需要的包在”crypto/md5”包中,需要先实例化一个MD5对象,然后在此基础上调用sum方法即可

md5 := md5.New()
io.Copy(md5,file)
MD5Str := hex.EncodeToString(md5.Sum(nil))

上面的代码实现了计算了文件MD5,其中file是multipart.File类型的,也可以是其他的已打开的其他文件类型。
当然也可以不使用io.copy,而是直接使用sum函数来计算:

md5 := md5.New()
MD5Str := hex.EncodeToString(md5.Sum(file))

这样是直接调用了sum函数来计算文件的值可能要比io.copy稍微慢一些。

字符串的MD5

有时候需要将已知的一段字符串加密,其实和文件加密大概是类似的,只需要调用write方法将字符串写入hash中:

md5 := md5.New()
md5
Golang中,要读取exe文件并获取安装包包含的进程名称及MD5,可以按以下步骤实现: ### 读取exe文件 使用`os.Open`函数打开exe文件,然后使用`ioutil.ReadAll`或`bufio`逐块读取文件内容。 ### 计算MD5 使用`crypto/md5`包计算文件内容的MD5哈希。 ### 获取进程名称 对于Windows系统,可以使用`syscall`包调用Windows API来获取文件的版本信息,从中提取进程名称。 以下是一个示例代码: ```go package main import ( "crypto/md5" "encoding/hex" "fmt" "io" "os" "syscall" "unsafe" ) // GetProcessName 获取exe文件的进程名称 func GetProcessName(filePath string) (string, error) { // 加载version.dll库 modVersion := syscall.NewLazyDLL("version.dll") procGetFileVersionInfoSize := modVersion.NewProc("GetFileVersionInfoSizeW") procGetFileVersionInfo := modVersion.NewProc("GetFileVersionInfoW") procVerQueryValue := modVersion.NewProc("VerQueryValueW") // 获取文件版本信息的大小 var size uint32 _, _, err := procGetFileVersionInfoSize.Call( uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filePath))), uintptr(unsafe.Pointer(&size))) if size == 0 { return "", err } // 分配内存以存储版本信息 versionInfo := make([]byte, size) // 获取文件版本信息 _, _, err = procGetFileVersionInfo.Call( uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filePath))), 0, uintptr(size), uintptr(unsafe.Pointer(&versionInfo[0]))) if err != nil { return "", err } // 查询产品名称 var productNamePtr uintptr var productNameLen uint32 _, _, err = procVerQueryValue.Call( uintptr(unsafe.Pointer(&versionInfo[0])), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(`\StringFileInfo\040904B0\ProductName`))), uintptr(unsafe.Pointer(&productNamePtr)), uintptr(unsafe.Pointer(&productNameLen))) if err != nil { return "", err } // 转换为字符串 productName := syscall.UTF16ToString((*[1 << 16]uint16)(unsafe.Pointer(productNamePtr))[:productNameLen/2]) return productName, nil } // GetMD5Hash 计算文件MD5哈希 func GetMD5Hash(filePath string) (string, error) { file, err := os.Open(filePath) if err != nil { return "", err } defer file.Close() hash := md5.New() if _, err := io.Copy(hash, file); err != nil { return "", err } hashInBytes := hash.Sum(nil)[:16] return hex.EncodeToString(hashInBytes), nil } func main() { filePath := "your_exe_file.exe" // 获取进程名称 processName, err := GetProcessName(filePath) if err != nil { fmt.Printf("获取进程名称失败: %v\n", err) } else { fmt.Printf("进程名称: %s\n", processName) } // 计算MD5 md5Hash, err := GetMD5Hash(filePath) if err != nil { fmt.Printf("计算MD5失败: %v\n", err) } else { fmt.Printf("MD5: %s\n", md5Hash) } } ``` ### 代码解释 1. **GetProcessName函数**:该函数通过调用Windows API获取exe文件的版本信息,并从中提取产品名称作为进程名称。 2. **GetMD5Hash函数**:该函数打开文件计算MD5哈希。 3. **main函数**:调用上述两个函数并输出进程名称和MD5。 ### 注意事项 - 上述代码仅适用于Windows系统,因为它调用了Windows API。 - 确保文件路径正确,并且程序具有读取文件的权限。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值