I just make my own hashes:
package main
import (
"encoding/binary"
"encoding/hex"
"fmt"
)
type HashGenerator struct{}
func (h *HashGenerator) generateHash(data []byte) string {
return h.hashFunction(data)
}
func (h *HashGenerator) hashFunction(data []byte) string {
var hh = [8]uint32{
1779033703, 3144134277, 1013904242, 2773480762,
1359893119, 2600822924, 528734635, 1541459225,
}
var k = [64]uint32{
1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993,
2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987,
1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774,
264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986,
2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711,
113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411,
3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344,
430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424,
2428436474, 2756734187, 3204031479, 3329325298,
}
padding := make([]byte, 64-len(data)%64)
padding[0] = 0x80
data = append(data, padding...)
data = append(data, make([]byte, 8)...)
binary.BigEndian.PutUint64(data[len(data)-8:], uint64(len(data)-len(padding)-8)*8)
var w [64]uint32
for i := 0; i < len(data); i += 64 {
for j := 0; j < 16; j++ {
w[j] = binary.BigEndian.Uint32(data[i+j*4 : i+j*4+4])
}
for j := 16; j < 64; j++ {
s0 := (w[j-15]>>7 | w[j-15]<<(32-7)) ^ (w[j-15]>>18 | w[j-15]<<(32-18)) ^ (w[j-15] >> 3)
s1 := (w[j-2]>>17 | w[j-2]<<(32-17)) ^ (w[j-2]>>19 | w[j-2]<<(32-19)) ^ (w[j-2] >> 10)
w[j] = w[j-16] + s0 + w[j-7] + s1
}
a, b, c, d, e, f, g, h0 := hh[0], hh[1], hh[2], hh[3], hh[4], hh[5], hh[6], hh[7]
for j := 0; j < 64; j++ {
s1 := (e>>6 | e<<(32-6)) ^ (e>>11 | e<<(32-11)) ^ (e>>25 | e<<(32-25))
ch := (e & f) ^ (^e & g)
temp1 := h0 + s1 + ch + k[j] + w[j]
s0 := (a>>2 | a<<(32-2)) ^ (a>>13 | a<<(32-13)) ^ (a>>22 | a<<(32-22))
maj := (a & b) ^ (a & c) ^ (b & c)
temp2 := s0 + maj
h0 = g
g = f
f = e
e = d + temp1
d = c
c = b
b = a
a = temp1 + temp2
}
hh[0] += a
hh[1] += b
hh[2] += c
hh[3] += d
hh[4] += e
hh[5] += f
hh[6] += g
hh[7] += h0
}
var hash [32]byte
for i, val := range hh {
binary.BigEndian.PutUint32(hash[i*4:i*4+4], val)
}
return hex.EncodeToString(hash[:])
}
func verifyHash(data []byte, expectedHash string) bool {
hg := HashGenerator{}
actualHash := hg.generateHash(data)
return expectedHash == actualHash
}
func main() {
hg := HashGenerator{}
data := "brrr @sky."
hash := hg.generateHash([]byte(data))
fmt.Println("Hash:", hash)
valid := verifyHash([]byte(data), hash)
fmt.Println("Valid:", valid)
}