hashmdl.go 2.35 KiB
Newer Older
Sandeep S. Shewalkar's avatar
Sandeep S. Shewalkar committed
package hashmdl

import (
	"crypto/md5"
	"os"
	"strconv"

	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/filemdl"
	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/loggermdl"
	OneOfOne "github.com/OneOfOne/xxhash"
)

// GetHashChecksumOfByteArray Get Hash Check sum
func GetHashChecksumOfByteArray(byteArray []byte) (uint64, error) {
	if byteArray == nil || len(byteArray) <= 0 {
		loggermdl.LogError("data is nil or length is less than or equal to zero")
		return 0, errormdl.Wrap("data is nil or length is less than or equal to zero")
	}
	hash := OneOfOne.New64()
	_, writeerr := hash.Write(byteArray)
	if errormdl.CheckErr(writeerr) != nil {
		loggermdl.LogError("error occured while calling hash.Write : ", errormdl.CheckErr(writeerr))
		return 0, errormdl.CheckErr(writeerr)
	}
	return hash.Sum64(), nil
}

//GetHashChecksumOfFile Get Hash Check sum
func GetHashChecksumOfFile(filePath string) (uint64, error) {

	byteArray, readerr := filemdl.ReadFile(filePath)
	if errormdl.CheckErr(readerr) != nil {
		loggermdl.LogError("error occured while calling hash.Write : ", errormdl.CheckErr(readerr))

		return 0, errormdl.CheckErr(readerr)
	}
	hash, hasherr := GetHashChecksumOfByteArray(byteArray)
	if errormdl.CheckErr1(hasherr) != nil {
		loggermdl.LogError("error occured while calling GetHashChecksumOfByteArray  : ", errormdl.CheckErr1(hasherr))
		return 0, errormdl.CheckErr1(hasherr)
	}

	return hash, nil
}

// GetAtributeBasedHash this func will return the hash calcluted on basis of file attributes
func GetAtributeBasedHash(filePath string) (string, error) {
	fileInfo, statErr := os.Stat(filePath)
	if errormdl.CheckErr(statErr) != nil {
		loggermdl.LogError("error occured while getting stats of file : ", filePath, " : ", errormdl.CheckErr(statErr))
		return "", errormdl.CheckErr(statErr)
	}
	fileModTime := fileInfo.ModTime()
	fileLength := fileInfo.Size()
	customFileHash := strconv.FormatInt(fileModTime.Unix(), 10) + strconv.FormatInt(fileLength, 10)
	return customFileHash, nil
}

// TODO: implement another hashing algo instead of MD5
// Get128BitHash returns 128 bit hash
func Get128BitHash(data []byte) ([16]byte, error) {

	if data == nil || len(data) <= 0 {
		return [16]byte{}, errormdl.Wrap("data is nil or length is less than or equal to zero")
	}

	return md5.Sum(data), nil
}