欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang實(shí)現(xiàn)Md5校驗(yàn)的代碼示例

 更新時(shí)間:2024年07月28日 14:09:46   作者:貓頭鷹數(shù)據(jù)分析  
最近項(xiàng)目中有個(gè)需求,就是地圖文件下發(fā)后,接收方需要文件的md5值,和接收到的文件做比對(duì),以免文件不完整,引起bug,于是測(cè)試了下本地文件和遠(yuǎn)程文件的md5計(jì)算,所以本文給大家介紹了Golang實(shí)現(xiàn)Md5校驗(yàn),需要的朋友可以參考下

前言

最近項(xiàng)目中有個(gè)需求,就是地圖文件下發(fā)后,接收方需要文件的md5值,和接收到的文件做比對(duì),以免文件不完整,引起bug,于是測(cè)試了下本地文件和遠(yuǎn)程文件的md5計(jì)算。

1、本地文件

要獲取指定本地文件的MD5值,你可以使用crypto/md5包來計(jì)算文件的MD5散列值。以下是一個(gè)示例代碼,演示了如何打開一個(gè)文件并計(jì)算其MD5值:  

package main
 
import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"io"
	"net/http"
	"os"
)
 
func main() {
	Md5ByLocalFile()
}
 
func Md5ByLocalFile() {
	// // 指定文件路徑
	filePath := "d:/code/000fa28f-c114-49fe-9699-8c7f8b2eb222.png"
	// filePath := "https://minio.dev.inrobot.cloud/map/000fa28f-c114-49fe-9699-8c7f8b2eb222.png"
	// 打開文件
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("Failed to open file:", err)
		return
	}
	defer file.Close()
 
	// 創(chuàng)建一個(gè)md5哈希對(duì)象
	hasher := md5.New()
 
	// 將文件內(nèi)容讀入哈希對(duì)象
	if _, err := io.Copy(hasher, file); err != nil {
		fmt.Println("Failed to read file:", err)
		return
	}
 
	// 計(jì)算并獲取哈希值
	hashBytes := hasher.Sum(nil)
 
	// 將哈希值轉(zhuǎn)換為十六進(jìn)制字符串
	hashString := hex.EncodeToString(hashBytes)
 
	// 輸出MD5哈希值
	fmt.Println("MD5 hash of the file:", hashString)
}

輸出結(jié)果如下:

PS D:\gostudy2022\TimeScheduler\md5> go run .\main.go
LocalFile MD5 hash of the file: b4735b024f3552b1277671303149719b

2、遠(yuǎn)程文件

遠(yuǎn)程文件其實(shí)就是網(wǎng)絡(luò)中可訪問的資源文件,要獲取指定網(wǎng)絡(luò)地址的文件的MD5值,你需要先下載文件的內(nèi)容到內(nèi)存或磁盤上,然后再計(jì)算其MD5值。這里我展示一個(gè)示例,該示例使用net/http包來下載文件,并使用crypto/md5包來計(jì)算MD5值。以下是完整的示例代碼:

package main
 
import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"io"
	"net/http"
	"os"
)
 
func main() {
	Md5ByRemoteFile()
}
 
func Md5ByRemoteFile() {
	// 指定文件的URL
	url := "https://minio.dev.inrobot.cloud/map/000fa28f-c114-49fe-9699-8c7f8b2eb222.png"
 
	// 發(fā)起HTTP GET請(qǐng)求
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println("Failed to fetch file:", err)
		return
	}
	defer resp.Body.Close()
 
	// 檢查響應(yīng)狀態(tài)碼
	if resp.StatusCode != http.StatusOK {
		fmt.Printf("Failed to fetch file: HTTP status code %d\n", resp.StatusCode)
		return
	}
 
	// 創(chuàng)建一個(gè)md5哈希對(duì)象
	hasher := md5.New()
 
	// 將文件內(nèi)容讀入哈希對(duì)象
	if _, err := io.Copy(hasher, resp.Body); err != nil {
		fmt.Println("Failed to read file:", err)
		return
	}
 
	// 計(jì)算并獲取哈希值
	hashBytes := hasher.Sum(nil)
 
	// 將哈希值轉(zhuǎn)換為十六進(jìn)制字符串
	hashString := hex.EncodeToString(hashBytes)
 
	// 輸出MD5哈希值
	fmt.Println("MD5 hash of the file:", hashString)
}

這里遠(yuǎn)程文件和上例的文件相同,輸出結(jié)果如下:

PS D:\gostudy2022\TimeScheduler\md5> go run .\main.go
RemoteFile MD5 hash of the file: b4735b024f3552b1277671303149719b

可以看到,本地文件和遠(yuǎn)程文件的md5值是相同的,從而在項(xiàng)目中,我們可以根據(jù)md5值是否相同,判斷文件是不是同一個(gè)文件,有沒有被損壞或篡改。

拓展:Golang 計(jì)算MD5值

代碼

//MD5 
func Md5SmallFile(path string) (string, error) {
   file, err := os.Open(path)
   if err != nil {
      return "", err
   }
   defer file.Close()

   h := md5.New()
   _, err = io.Copy(h, file)
   if err != nil {
      return "", err
   }

   return hex.EncodeToString(h.Sum(nil)), nil
}


func Md5BigFile(path string) (string, error) {
   var fileChunk uint64 = 10485760
   file, err := os.Open(path)
   if err != nil {
      return "", err
   }
   defer file.Close()
   // calculate the file size
   info, _ := file.Stat()
   fileSize := info.Size()
   blocks := uint64(math.Ceil(float64(fileSize) / float64(fileChunk)))
   h := md5.New()

   for i := uint64(0); i < blocks; i++ {
      blockSize := int(math.Min(float64(fileChunk), float64(fileSize-int64(i*fileChunk))))
      buf := make([]byte, blockSize)

      _, err := file.Read(buf)
      if err != nil {
         return "", err
      }
      _, err = io.WriteString(h, string(buf)) // append into the hash
      if err != nil {
         return "", err
      }
   }
   
   return hex.EncodeToString(h.Sum(nil)), nil
}


func MD5String(v string) string {
	d := []byte(v)
	m := md5.New()
	m.Write(d)
	return hex.EncodeToString(m.Sum(nil))
}

md5.New()返回一個(gè) hash.Hash 對(duì)象

hash.Hash對(duì)象定義了一個(gè)Sum接口,其原型為:

func Sum(data []byte) [Size]byte

Sum()對(duì)hash.Hash對(duì)象內(nèi)部存儲(chǔ)的內(nèi)容進(jìn)行校驗(yàn)計(jì)算,然后將其追加到data的后面形成一個(gè)新的byte切片,所以一般需要將data設(shè)為nil。

到此這篇關(guān)于Golang實(shí)現(xiàn)Md5校驗(yàn)的代碼示例的文章就介紹到這了,更多相關(guān)Golang Md5校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言的隊(duì)列和堆棧實(shí)現(xiàn)方法

    Go語言的隊(duì)列和堆棧實(shí)現(xiàn)方法

    這篇文章主要介紹了Go語言的隊(duì)列和堆棧實(shí)現(xiàn)方法,涉及container/list包的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Golang獲取當(dāng)前時(shí)間代碼

    Golang獲取當(dāng)前時(shí)間代碼

    本文給大家匯總介紹了golang中的相關(guān)的時(shí)間的操作,有需要的小伙伴可以拿走參考下
    2018-10-10
  • 如何用go-zero 實(shí)現(xiàn)中臺(tái)系統(tǒng)

    如何用go-zero 實(shí)現(xiàn)中臺(tái)系統(tǒng)

    這篇文章主要介紹了如何用go-zero 實(shí)現(xiàn)中臺(tái)系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 淺談go-restful框架的使用和實(shí)現(xiàn)

    淺談go-restful框架的使用和實(shí)現(xiàn)

    這篇文章主要介紹了淺談go-restful框架的使用和實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 在?Go?語言中使用?regexp?包處理正則表達(dá)式的操作

    在?Go?語言中使用?regexp?包處理正則表達(dá)式的操作

    正則表達(dá)式是處理字符串時(shí)一個(gè)非常強(qiáng)大的工具,而?Go?語言的?regexp?包提供了簡(jiǎn)單而強(qiáng)大的接口來使用正則表達(dá)式,本文將介紹如何在?Go?中使用?regexp?包來編譯和執(zhí)行正則表達(dá)式,以及如何從文本中匹配和提取信息,感興趣的朋友一起看看吧
    2023-12-12
  • go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無返回值)

    go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無返回值)

    本文主要介紹了go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無返回值),主要用于執(zhí)行shell命令,并且返回shell的標(biāo)準(zhǔn)輸出,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • Go語言中的包Package詳解

    Go語言中的包Package詳解

    本文詳細(xì)講解了Go語言中的包Package,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • go貨幣計(jì)算時(shí)如何避免浮點(diǎn)數(shù)精度問題

    go貨幣計(jì)算時(shí)如何避免浮點(diǎn)數(shù)精度問題

    在開發(fā)的初始階段,我們經(jīng)常會(huì)遇到“浮點(diǎn)數(shù)精度”和“貨幣值表示”的問題,那么在golang中如何避免這一方面的問題呢,下面就跟隨小編一起來學(xué)習(xí)一下吧
    2024-02-02
  • 源碼分析Go語言使用cgo導(dǎo)致線程增長(zhǎng)的原因

    源碼分析Go語言使用cgo導(dǎo)致線程增長(zhǎng)的原因

    這篇文章主要從一個(gè)cgo調(diào)用開始解析Go語言源碼,從而分析一下造成線程增長(zhǎng)的原因,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下
    2023-06-06
  • 使用Golang的singleflight防止緩存擊穿的方法

    使用Golang的singleflight防止緩存擊穿的方法

    這篇文章主要介紹了使用Golang的singleflight防止緩存擊穿的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評(píng)論