首先,在计算文件的哈希值时,通常先读取文件,然后将文件数据写入hash writer。 但是,如果需要导出文件来计算散列值,请自定义hash writer以快速导出和计算散列值。
HashWriter导出文件,计算哈希值(MD5、SHA1、SHA256 ),并简单地封装计算哈希值的HashWriter。
如下所示。
packagehashimport (' crypto/MD5 ' ' crypto/sha1 ' ' crypto/sha 256 ' ' fmt ' ' hash ' ' sync ' )/# region HashWriter在channel中进行各散列的计算typehashwriterstruct { m d5w hash.hash m D5 chan chan [ ] bytes h a1w hash.hashalchan [ ] bytetes byteonceclose * sync.once//WG * sync.wait group } funcnewhashwriter (usemdwriter )只关闭一次usesha256bool(* hashwriter(writer:=new ) hashwriter ) writer.onceclose=new(sync.once ) writer.WG=new ) sync.once (WG ) riter.md5w=MD5.new (writer.m D5 chan=make ) chan[]byte, chancount (go writer.write MD5 (} ifusesha1) hashcountwriter.sha1w=sha1.new ) (writer.sha1chan=make ) ) chan[] Chancount(goWriter.writesha1 ) (ifusesha256 ) hashcountwriter.sha 256 w=sha 256.new ) (Writer.sha256chan=make ) ) a256 ) ) Writer.WG.add ) Hashcount ) ReturnWriter ) func ) this*HashWriter ) writeMd5 ) ) chanCount ) writeshwriter 65 TTT func ) this*hashwriter ) writeSha1 ) {Dowritehash ) } this.sha1 chan (fmt.println (sha1 exit ) this.WG.done } funf this.sha256chan(fmt.println ) sha 256 exit (this.WG.done ) } funcdowritehash (writer hash.hash、 inchan ) ) ban open { return } writer.write (buf ) }}func ) this*hashwriter ) write ) buf[]byte )//此通道传递=nil { this.sha1 chan-tmpbuf } if this.sha 256 chan!=nil { this.sha 256 chan-tmpbuf } func (this * hash writer ) Close () this.onceclose.do ) func ) if this.md5cc=nil=nil{close(this.sha1chan ) }if this.sha256Chan!=nil{close(this.sha256chan ) } ) func ) this*hashwriter ) sum ) b ) byte ) mD5sum ) byte,sha1sum ) ) byte=nil=nil{sha1sum=this.sha1w.sum(b ) }if this.sha256W!=nil { sha256sum=this.sha 256 w.sum (b ) }return}//#endregion使用:
packagemainimport(fmt(io ) OS ) time ) (func main ),err:=OS.open ) f: ) testtest.DD ) )。=nil{fmt.println(err ) return ) start:=time.now ) (defer func ) }{fmt.println ) HashWriter )需要一些时间。 ',time.Now ().sub(start ) ) HW :=newhashwriter (true,false,true ) defer hw.Close ) ) b:=make ()=读取=nil(fmt.println ) )文件错误:',err ) return ) HW.write ) b [ : n ] } m D5 buf、sha1Buf、sha 256 buf 3360=