Hi.  I'm trying to learn Go after many years of using a different
language.  My development machine runs Ubuntu 16.04 amd64, go 1.6.2
linux/amd

I compared the output of the following code, and my output differs from the
std utilities such as sha1sum, sha215sum, etc.  I used
go1.6.3.windows-386.msi as my test file.

I also noticed that the hashes that were output were different, depending
on the value I set for my ReadBufferSize.  I don't understand why the
output I'm seeing doesn't match the std utilities, and why the hashes vary
w/ my buffer size.

Thanks,
Rob Solomon

package main;

import (
"os"
"fmt"
"runtime"
"encoding/hex"
"crypto/sha512"
"crypto/sha256"
"crypto/sha1"
"crypto/md5"
"io"
"hash"
"getcommandline"   // this one's mine.
)

func main() {

  const K = 1024;
  const M = 1024*1024;

  const (
         md5hash = iota
         sha1hash
         sha256hash
         sha384hash
         sha512hash
         HashType
        );

  const ReadBufferSize = 10 * M;

  var HashName = [...]string{"md5","sha1","sha256","sha384","sha512"};
  var WhichHash int;
  var hasher hash.Hash;
  var FileSize int64;


  if len(os.Args) <= 1 {
    fmt.Println(" Need input filename as a param. ");
    os.Exit(0);
  }
  FileToHash := getcommandline.GetCommandLineString();

  fmt.Println();
  fmt.Print(" GOOS =",runtime.GOOS,".  ARCH=",runtime.GOARCH);
  fmt.Println("  WhichHash = ",HashName[WhichHash]);
  fmt.Println();
  fmt.Println();

  for {
    FileSize = 0;

    /* Create Hash Section */
    TargetFile,readErr := os.Open(FileToHash);
    check(readErr," Error opening FileToHash.");
    defer TargetFile.Close();

    switch WhichHash {     // Initialing case switch on WhichHash
    case md5hash :
           hasher = md5.New();
    case sha1hash :
           hasher = sha1.New();
    case sha256hash :
           hasher = sha256.New();
    case sha384hash :
           hasher = sha512.New384();
    case sha512hash :
           hasher = sha512.New();
    default:
           hasher = sha256.New();
    } /* initializing case on WhichHash */

    FileReadBuffer := make([]byte,ReadBufferSize);
    for {   // Repeat Until eof loop.
      n,err := TargetFile.Read(FileReadBuffer);
      if n == 0 || err == io.EOF { break }
      check(err," Unexpected error while reading the target file on which
to compute the hash,");
      hasher.Write(FileReadBuffer);
      FileSize += int64(n);
    } // Repeat Until TargetFile.eof loop;

    HashValueComputedStr := hex.EncodeToString(hasher.Sum(nil));

    fmt.Println(" Filename  = ",FileToHash,", FileSize = ",FileSize,",
",HashName[WhichHash]," computed hash string, followed by hash string in
the file are : ");
    fmt.Println(" Computed hash hex encoded:",HashValueComputedStr);

    TargetFile.Close();     // Close the handle to allow opening a target
from the next line, if there is one.
    fmt.Println();
    fmt.Println();

    WhichHash++
    if WhichHash > sha512hash {break}
  }   /* outer LOOP */

  fmt.Println();
}

// ------------------------------------------------------- check
-------------------------------
func check(e error, msg string) {
  if e != nil {
    fmt.Errorf("%s : ",msg);
    panic(e);
  }
}

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to