+type MultiHasher struct {
+ sha256h hash.Hash
+ sha512h hash.Hash
+ streebog256h hash.Hash
+ streebog512h hash.Hash
+ g sync.WaitGroup
+}
+
+func NewMultiHasher() *MultiHasher {
+ return &MultiHasher{
+ sha256h: sha256.New(),
+ sha512h: sha512.New(),
+ streebog256h: gost34112012256.New(),
+ streebog512h: gost34112012512.New(),
+ }
+}
+
+func (h *MultiHasher) Write(p []byte) (n int, err error) {
+ h.g.Add(4)
+ go func() {
+ if _, err := h.sha256h.Write(p); err != nil {
+ panic(err)
+ }
+ h.g.Done()
+ }()
+ go func() {
+ if _, err := h.sha512h.Write(p); err != nil {
+ panic(err)
+ }
+ h.g.Done()
+ }()
+ go func() {
+ if _, err := h.streebog256h.Write(p); err != nil {
+ panic(err)
+ }
+ h.g.Done()
+ }()
+ go func() {
+ if _, err := h.streebog512h.Write(p); err != nil {
+ panic(err)
+ }
+ h.g.Done()
+ }()
+ h.g.Wait()
+ return len(p), nil
+}
+