package main import "fmt" import "crypto/sha256" import "io" import "log" import "os" import "path/filepath" import "sync/atomic" var chan_hash chan string var running int32 func walk(path string, info os.FileInfo, err error) error { if err != nil { log.Fatalln(err) return err } if info.IsDir() { return nil } else { atomic.AddInt32(&running, 1) go hash(info.Name(), path) } return nil } func hash(name string, path string) { h, err := sha256File(path) if err != nil { log.Fatalln(err) } chan_hash <- fmt.Sprintf("SHA256 (%s) = %x", name, h) } func sha256File(path string) ([]byte, error) { f, err := os.Open(path) if err != nil { log.Fatalln(err) return nil, err } defer f.Close() h := sha256.New() io.Copy(h, f) return h.Sum(nil), nil } func main() { if len(os.Args) < 2 { log.Fatalln("Usage shadir file") } chan_hash = make(chan string) if err := filepath.Walk(os.Args[1], walk); err != nil { panic(err) } for str := range chan_hash { fmt.Println(str) atomic.AddInt32(&running, -1) if running <= 0 { return } } }