package main import "fmt" import "crypto/sha256" import "io" import "log" import "os" import "path/filepath" import "sync" func sha256File(path string) (string, error) { f, err := os.Open(path) if err != nil { return "", err } defer f.Close() h := sha256.New() io.Copy(h, f) return fmt.Sprintf("SHA256 (%s) = %x", path, h.Sum(nil)), nil } func runParallel(n uint, what func()) { var wg sync.WaitGroup for i := 0; i < int(n); i++ { wg.Add(1) what() wg.Done() } wg.Wait() } func main() { if len(os.Args) < 2 { log.Fatalln("Usage shadir file") } chan_hash, chan_path := make(chan string), make(chan string) go func() { runParallel(100, func() { // 100 routines hashing for path := range chan_path { if h, err := sha256File(path); err != nil { log.Print("Error "+path, err) } else { chan_hash <- h } } }) close(chan_hash) }() go func() { // walk through files filepath.Walk(os.Args[1], func(path string, info os.FileInfo, err error) error { if err == nil && !info.IsDir() { chan_path <- path } return err }) close(chan_path) }() for h := range chan_hash { fmt.Println(h) } }