github.com/kaydxh/golang@v0.0.131/go/crypto/md5/md5.go (about) 1 /* 2 *Copyright (c) 2022, kaydxh 3 * 4 *Permission is hereby granted, free of charge, to any person obtaining a copy 5 *of this software and associated documentation files (the "Software"), to deal 6 *in the Software without restriction, including without limitation the rights 7 *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 *copies of the Software, and to permit persons to whom the Software is 9 *furnished to do so, subject to the following conditions: 10 * 11 *The above copyright notice and this permission notice shall be included in all 12 *copies or substantial portions of the Software. 13 * 14 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 *SOFTWARE. 21 */ 22 package md5 23 24 import ( 25 "bytes" 26 "crypto/md5" 27 "encoding/hex" 28 "io" 29 "os" 30 31 os_ "github.com/kaydxh/golang/go/os" 32 ) 33 34 func SumBytes(b []byte) string { 35 h := md5.New() 36 h.Write(b) 37 return hex.EncodeToString(h.Sum(nil)) 38 } 39 40 func SumString(s string) string { 41 return SumBytes([]byte(s)) 42 } 43 44 func SumReader(r io.Reader) (string, error) { 45 h := md5.New() 46 if _, err := io.Copy(h, r); err != nil { 47 return "", err 48 } 49 50 return hex.EncodeToString(h.Sum(nil)), nil 51 } 52 53 func SumReaderN(r io.Reader, n int64) (string, error) { 54 h := md5.New() 55 if _, err := io.CopyN(h, r, n); err != nil { 56 return "", err 57 } 58 59 return hex.EncodeToString(h.Sum(nil)), nil 60 } 61 62 func SumReaderAt(r io.ReaderAt, offset, length int64) (string, error) { 63 h := md5.New() 64 buf := make([]byte, 1024) 65 var total int64 66 67 for total < length { 68 n, err := r.ReadAt(buf, offset) 69 if err == nil || err == io.EOF { 70 if n > 0 { 71 _, tmpErr := io.CopyN(h, bytes.NewReader(buf), int64(n)) 72 if tmpErr != nil { 73 return "", tmpErr 74 } 75 offset += int64(n) 76 total += int64(n) 77 78 } 79 80 if err == io.EOF { 81 break 82 } 83 } else { 84 return "", err 85 } 86 87 } 88 89 return hex.EncodeToString(h.Sum(nil)), nil 90 } 91 92 func SumFile(fileName string) (string, error) { 93 file, err := os_.OpenFile(fileName, true) 94 if err != nil { 95 return "", err 96 } 97 defer file.Close() 98 99 return SumReader(file) 100 } 101 102 func SumFileAt(fileName string, offset int64, length int64) (string, error) { 103 file, err := os_.OpenAll(fileName, os.O_RDWR, os.ModePerm) 104 if err != nil { 105 return "", err 106 } 107 defer file.Close() 108 109 return SumReaderAt(file, offset, length) 110 }