Generate SHA1 hash of a file in Golang example

April 8, 2016

This function is based on my previous post but adapted for the SHA1 algorithm.

A Go function

The argument you have to specify in the following function is the path to the file you desire to hash (the absolute path or relative path), and the output is either an empty string with an error, or a string with 40 characters and a nil error.

import (
	"crypto/md5"
	"encoding/hex"
	"io"
	"os"
)
func hash_file_sha1(filePath string) (string, error) {
	//Initialize variable returnMD5String now in case an error has to be returned
	var returnSHA1String string
	
	//Open the filepath passed by the argument and check for any error
	file, err := os.Open(filePath)
	if err != nil {
		return returnSHA1String, err
	}
	
	//Tell the program to call the following function when the current function returns
	defer file.Close()
	
	//Open a new SHA1 hash interface to write to
	hash := sha1.New()
	
	//Copy the file in the hash interface and check for any error
	if _, err := io.Copy(hash, file); err != nil {
		return returnSHA1String, err
	}
	
	//Get the 20 bytes hash
	hashInBytes := hash.Sum(nil)[:20]
	
	//Convert the bytes to a string
	returnSHA1String = hex.EncodeToString(hashInBytes)
	
	return returnSHA1String, nil
}

Example

This example calculates the SHA1 hash of itself, the running program.

package main
import (
	"crypto/sha1"
	"encoding/hex"
	"fmt"
	"io"
	"os"
)
func hash_file_sha1(filePath string) (string, error) {
	var returnSHA1String string
	file, err := os.Open(filePath)
	if err != nil {
		return returnSHA1String, err
	}
	defer file.Close()
	hash := sha1.New()
	if _, err := io.Copy(hash, file); err != nil {
		return returnSHA1String, err
	}
	hashInBytes := hash.Sum(nil)[:20]
	returnSHA1String = hex.EncodeToString(hashInBytes)
	return returnSHA1String, nil
}
func main() {
	hash, err := hash_file_sha1(os.Args[0])
	if err == nil {
		fmt.Println(hash)
	}
}

Read also

Generate CRC32 hash of a file in Golang turorial
Generate MD5 hash of a file in Golang
Golang transfer a file over a TCP socket
Implementing a TCP Client and Server in Go: A Ping Pong Example
Golang hash sum and checksum to string tutorial and examples
Golang human readable byte sizes
Comments
Tags