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  }