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 }