leb.io/aeshash@v0.1.2/aeshash/aeshash.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 _ "unsafe" 8 9 "leb.io/aeshash" 10 ) 11 12 const blockSize = 1024 * 1024 13 14 func readFullAESHash(path string) (r uint64) { 15 //fmt.Printf("readFullAESHash: file=%q\n", path) 16 f, err := os.Open(path) 17 if err != nil { 18 fmt.Printf("file %q, err=%v", path, err) 19 } 20 defer f.Close() 21 22 buf := make([]byte, blockSize) 23 hf := aeshash.NewAES(0) 24 hf.Reset() 25 for { 26 l, err := f.Read(buf) 27 //fmt.Printf("f=%q, err=%v, l=%d, size=%d\n", fi.Name(), err, l, fi.Size()) 28 if l == 0 { 29 break 30 } 31 if l < 0 || err != nil { 32 fmt.Printf("file %q, err=%v", path, err) 33 return 34 } 35 hf.Write(buf[:l]) 36 } 37 r = hf.Sum64() 38 //fmt.Printf("readFullHash: p=%q, r=%#016x\n", p, r) 39 //h.Write(buf[0:l]) 40 //r = h.Sum64() 41 //fmt.Printf("readFullHash: file=%q, hash=0x%016x\n", p, r) 42 return r 43 } 44 45 func main() { 46 var arg = flag.Uint64("i", 0, "number to hash") 47 var seed = flag.Uint64("s", 0, "seed to hash") 48 var zero = flag.Bool("z", false, "hash of 0") 49 50 flag.Parse() 51 switch { 52 case *arg != 0 || *zero: 53 fmt.Printf("%#016x\n", aeshash.Hash64(*arg, *seed)) 54 default: 55 if len(flag.Args()) <= 0 { 56 return 57 } 58 //fmt.Printf("main: nargs=%d\n", len(flag.Args())) 59 for _, path := range flag.Args() { 60 h := readFullAESHash(path) 61 fmt.Printf("%016x\t%s\n", h, path) 62 } 63 } 64 }