// reads file in 512KB chunks func FileCRC64(fname string) (uint64, error) { var checksum uint64 var bufSize = 1024 * 512 fp, err := os.Open(fname) if err != nil { return 0, err //fmt.Printf("!Err-> can't read %s\n", fname) //log.Panicf("!Err-> can't read %s %s\n", fname, err) } defer fp.Close() bufr := make([]byte, bufSize) checksum = 0 for { n, err := io.ReadFull(fp, bufr) if err != nil { if n > 0 { // fmt.Printf("not full block but read %d bytes\n",n) } } if err == io.EOF { if n != 0 { return 0, err } else { break // normal end of file reached } } // fmt.Printf(" read %d bytes\n",n) checksum = crc64.Update(checksum, G_crcTable, bufr[0:n]) // checksum = crc64.Checksum(bufr[0:n],crcTable) if entire string in bufr } return checksum, nil }
// TestContentEqual can be extremely slow (dozens of seconds) if // GOMAXPROCS==1. func TestContentEqual(t *testing.T) { defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU())) nConsumers := 10 done := make(chan uint64, nConsumers) tab := crc64.MakeTable(crc64.ECMA) sm := NewSourceMap() defer sm.Close() for i := 0; i < nConsumers; i++ { go func() { rdr := sm.NewReader("/dev/urandom", &Config{ SourceBuffer: 32, FrameBytes: 65536, CloseIdle: true, Reopen: false, }) defer rdr.Close() var hash uint64 defer func() { done <- hash }() var frame = make([]byte, 65536) for f := 0; f < 130; f++ { var err error if _, err = rdr.Read(frame); err != nil && err != io.EOF { t.Fatalf("rdr.Read(frame) at frame %d: %s", rdr.nextFrame, err) } hash = crc64.Update(hash, tab, frame) } }() } h0 := <-done for i := 1; i < nConsumers; i++ { hi := <-done if h0 == 0 { h0 = hi } else if hi != h0 { t.Errorf("hash mismatch: h0=%x, h%d=%x", h0, i, hi) } } }