最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

1、本地文件

要獲取指定本地文件的MD5值,你可以使用crypto/md5包來計算文件的MD5散列值。以下是一個示例代碼,演示了如何打開一個文件并計算其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)建一個md5哈希對象
	hasher := md5.New()
 
	// 將文件內(nèi)容讀入哈希對象
	if _, err := io.Copy(hasher, file); err != nil {
		fmt.Println("Failed to read file:", err)
		return
	}
 
	// 計算并獲取哈希值
	hashBytes := hasher.Sum(nil)
 
	// 將哈希值轉換為十六進制字符串
	hashString := hex.EncodeToString(hashBytes)
 
	// 輸出MD5哈希值
	fmt.Println("MD5 hash of the file:", hashString)
}

輸出結果如下:

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

2、遠程文件

遠程文件其實就是網(wǎng)絡中可訪問的資源文件,要獲取指定網(wǎng)絡地址的文件的MD5值,你需要先下載文件的內(nèi)容到內(nèi)存或磁盤上,然后再計算其MD5值。這里我展示一個示例,該示例使用net/http包來下載文件,并使用crypto/md5包來計算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請求
	resp, err := http.Get(url)
	if err != nil {
		fmt.Println("Failed to fetch file:", err)
		return
	}
	defer resp.Body.Close()
 
	// 檢查響應狀態(tài)碼
	if resp.StatusCode != http.StatusOK {
		fmt.Printf("Failed to fetch file: HTTP status code %d\n", resp.StatusCode)
		return
	}
 
	// 創(chuàng)建一個md5哈希對象
	hasher := md5.New()
 
	// 將文件內(nèi)容讀入哈希對象
	if _, err := io.Copy(hasher, resp.Body); err != nil {
		fmt.Println("Failed to read file:", err)
		return
	}
 
	// 計算并獲取哈希值
	hashBytes := hasher.Sum(nil)
 
	// 將哈希值轉換為十六進制字符串
	hashString := hex.EncodeToString(hashBytes)
 
	// 輸出MD5哈希值
	fmt.Println("MD5 hash of the file:", hashString)
}

這里遠程文件和上例的文件相同,輸出結果如下:

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

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

拓展:Golang 計算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()返回一個 hash.Hash 對象

hash.Hash對象定義了一個Sum接口,其原型為:

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

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

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

相關文章

  • Golang如何構造最佳隨機密碼詳解

    Golang如何構造最佳隨機密碼詳解

    人們往往有使用同一密碼的習慣,為了防止數(shù)據(jù)庫意外泄露/破壞和出于保護用戶隱私的目的,下面這篇文章主要給大家介紹了關于Golang如何構造最佳隨機密碼的相關資料,需要的朋友可以參考下
    2023-01-01
  • gRPC的發(fā)布訂閱模式及REST接口和超時控制

    gRPC的發(fā)布訂閱模式及REST接口和超時控制

    這篇文章主要為大家介紹了gRPC的發(fā)布訂閱模式及REST接口和超時控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 詳解Golang如何在編譯時注入版本信息

    詳解Golang如何在編譯時注入版本信息

    這篇文章主要為大家詳細介紹了Golang如何在編譯時實現(xiàn)注入版本信息,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的可以了解一下
    2023-06-06
  • 使用Go添加HTTPS的實現(xiàn)代碼示例

    使用Go添加HTTPS的實現(xiàn)代碼示例

    這篇文章主要介紹了使用Go添加HTTPS的實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • golang中new與make的區(qū)別講解

    golang中new與make的區(qū)別講解

    new只能開辟單個空間,不能為引用類型開辟多個空間,并且new是對類型進行內(nèi)存的開辟,返回一個指向該內(nèi)存空間的指針類型,如果使用new去初始化引用數(shù)據(jù)類型,不是很合適(當然,new一個對象還是可以的),因此就需要用到另一個內(nèi)置函數(shù)make,需要的朋友可以參考下
    2023-01-01
  • Go實現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結構的操作方法

    Go實現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結構的操作方法

    Go語言團隊的一個核心目標是保持語言的簡單性,他們認為,如果一個功能可以用簡單的組合來實現(xiàn),那就沒有必要把它放進標準庫里,本文給大家介紹Go實現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結構的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 重學Go語言之JSON操作詳解

    重學Go語言之JSON操作詳解

    JSON的全稱是Javascript?Object?Notation,是一種數(shù)據(jù)結構化交互的標準協(xié)議,這篇文章主要是來和大家介紹一下Go語言中JSON的相關操作,需要的可以參考下
    2023-08-08
  • go語言通過zlib壓縮數(shù)據(jù)的方法

    go語言通過zlib壓縮數(shù)據(jù)的方法

    這篇文章主要介紹了go語言通過zlib壓縮數(shù)據(jù)的方法,實例分析了Go語言中zlib的使用技巧,需要的朋友可以參考下
    2015-03-03
  • Ubuntu18.04 LTS搭建GO語言開發(fā)環(huán)境過程解析

    Ubuntu18.04 LTS搭建GO語言開發(fā)環(huán)境過程解析

    這篇文章主要介紹了Ubuntu18.04 LTS搭建GO語言開發(fā)環(huán)境過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Go語言實現(xiàn)定時器的方法

    Go語言實現(xiàn)定時器的方法

    這篇文章主要介紹了Go語言實現(xiàn)定時器的方法,涉及Go語言時間操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02

最新評論

华蓥市| 青浦区| 巴彦淖尔市| 离岛区| 绥化市| 松阳县| 长岛县| 黄大仙区| 怀集县| 黄平县| 南陵县| 庆阳市| 临武县| 青田县| 师宗县| 肥西县| 龙泉市| 阿拉善盟| 金坛市| 石家庄市| 南雄市| 信丰县| 乐东| 文山县| 利辛县| 罗山县| 永福县| 通河县| 云龙县| 松溪县| 独山县| 嵩明县| 根河市| 施秉县| 广东省| 石棉县| 左云县| 庆安县| 台安县| 政和县| 正阳县|