package main import ( "encoding/hex" "flag" "fmt" "io" "os" "sync" "github.com/zeebo/blake3" ) var ( help = flag.Bool("h", false, "Prints help information") length = flag.Int("l", 32, "The number of output bytes, prior to hex encoding") par = flag.Int("p", 4, "The maximum concurrency") ) func main() { flag.Parse() if *help || len(flag.Args()) == 0 || *par < 1 { flag.Usage() os.Exit(0) } q := make(chan struct{}, *par) wg := &sync.WaitGroup{} for _, name := range flag.Args() { q <- struct{}{} wg.Add(1) go func(name string) { buf := [65536]byte{} file, err := os.Open(name) if err != nil { panic(err) } hasher := blake3.NewSized(*length) for { n, err := file.Read(buf[:]) hasher.Write(buf[:n]) if err == io.EOF { break } else if err != nil { panic(err) } } file.Close() hash := hasher.Sum([]byte{}) fmt.Print(hex.EncodeToString(hash)) fmt.Print(" ") fmt.Println(name) <- q wg.Done() }(name) } wg.Wait() }