Hi,
I want to calculate hash on 3 strings. First string is always the same, the
other may vary.
The first approach is to calculate the hash each time for the 3 strings (
BenchmarkHash)
Another approach would be to calculate once for the first string, and then
reuse this hash to calculate the hash with the other 2 strings
(BenchmarkCopyHash)
The difficulty is that sha256.New() returns a pointer, we have to copy the
first hash. To do this, I created the function copyHash()
But the performances are not exceptional.
Do you have another idea to do this in efficient way?
BenchmarkHash-8 1000000 1761
ns/op 176 B/op 4 allocs/op
BenchmarkCopyHash-8 1000000 1519
ns/op 240 B/op 4 allocs/op
var m1 = strings.Repeat("a", 64)
var m2 = strings.Repeat("b", 48)
var m3 = strings.Repeat("c", 32)
func BenchmarkHash(b *testing.B) {
var (
d hash.Hash
)
d = sha256.New()
for n := 0; n < b.N; n++ {
d.Reset()
d.Write([]byte(m1))
d.Write([]byte(m2))
d.Write([]byte(m3))
d.Sum(nil)
}
}
func BenchmarkCopyHash(b *testing.B) {
var (
d1 hash.Hash
d2 hash.Hash
)
d1 = sha256.New()
d1.Write([]byte(m1))
for n := 0; n < b.N; n++ {
d2 = copyHash(d1)
d2.Write([]byte(m2))
d2.Write([]byte(m3))
d2.Sum(nil)
}
}
func copyHash(src hash.Hash) hash.Hash {
typ := reflect.TypeOf(src).Elem()
val := reflect.ValueOf(src).Elem()
elem := reflect.New(typ).Elem()
elem.Set(val)
return elem.Addr().Interface().(hash.Hash)
}
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.