mirror of
https://github.com/xiaoqidun/ihash.git
synced 2024-11-05 10:28:44 +08:00
238 lines
5.0 KiB
Go
238 lines
5.0 KiB
Go
package main
|
||
|
||
import (
|
||
"bytes"
|
||
"crypto/md5"
|
||
"crypto/sha1"
|
||
"crypto/sha256"
|
||
"crypto/sha512"
|
||
"flag"
|
||
"fmt"
|
||
"golang.org/x/crypto/sha3"
|
||
"hash"
|
||
"io/ioutil"
|
||
"os"
|
||
"path/filepath"
|
||
"runtime"
|
||
"sort"
|
||
"strings"
|
||
)
|
||
|
||
var (
|
||
args []string
|
||
author bool
|
||
install string
|
||
)
|
||
|
||
var typeList = []string{
|
||
"md5sum",
|
||
"sha1sum",
|
||
"sha256sum",
|
||
"sha512sum",
|
||
"sha3sum224",
|
||
"sha3sum256",
|
||
"sha3sum384",
|
||
"sha3sum512",
|
||
}
|
||
|
||
func init() {
|
||
flag.BoolVar(&author, "author", false, "")
|
||
flag.StringVar(&install, "install", "", "")
|
||
flag.Parse()
|
||
args = flag.Args()
|
||
}
|
||
|
||
func main() {
|
||
if author {
|
||
AuthorInformation()
|
||
return
|
||
}
|
||
if "" != install {
|
||
InstallShortcut(install)
|
||
return
|
||
}
|
||
fileName := GetFileName()
|
||
hashIndex := InArray(fileName, typeList)
|
||
if -1 == hashIndex {
|
||
if 0 == len(args) {
|
||
return
|
||
}
|
||
hashType := args[0]
|
||
hashIndex = InArray(hashType, typeList)
|
||
if -1 == hashIndex {
|
||
return
|
||
}
|
||
args = args[1:]
|
||
}
|
||
if 0 == len(args) {
|
||
stdinBytes, _ := ioutil.ReadAll(os.Stdin)
|
||
fmt.Println(StrHash(typeList[hashIndex], bytes.TrimSpace(stdinBytes)))
|
||
return
|
||
}
|
||
hashFileList := GetFileList(args)
|
||
for _, hashFile := range hashFileList {
|
||
FileHash(typeList[hashIndex], hashFile)
|
||
}
|
||
}
|
||
|
||
func InArray(value interface{}, array interface{}) int {
|
||
switch array.(type) {
|
||
case []string:
|
||
for k, v := range array.([]string) {
|
||
if v == value.(string) {
|
||
return k
|
||
}
|
||
}
|
||
}
|
||
return -1
|
||
}
|
||
|
||
func StrHash(hashType string, hashData []byte) string {
|
||
var sum interface{}
|
||
switch hashType {
|
||
case "md5sum":
|
||
sum = md5.Sum(hashData)
|
||
case "sha1sum":
|
||
sum = sha1.Sum(hashData)
|
||
case "sha256sum":
|
||
sum = sha256.Sum256(hashData)
|
||
case "sha512sum":
|
||
sum = sha512.Sum512(hashData)
|
||
case "sha3sum224":
|
||
sum = sha3.Sum224(hashData)
|
||
case "sha3sum256":
|
||
sum = sha3.Sum256(hashData)
|
||
case "sha3sum384":
|
||
sum = sha3.Sum384(hashData)
|
||
case "sha3sum512":
|
||
sum = sha3.Sum512(hashData)
|
||
}
|
||
return fmt.Sprintf("%x", sum)
|
||
}
|
||
|
||
func FileHash(hashType string, hashFile string) {
|
||
msg := "progress:%.2f%% filename:%s\r"
|
||
success := "%x %s\n"
|
||
fileOpen, err := os.Open(hashFile)
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer func() {
|
||
_ = fileOpen.Close()
|
||
}()
|
||
fileStat, err := fileOpen.Stat()
|
||
if err != nil || fileStat.IsDir() {
|
||
return
|
||
}
|
||
fileSize := fileStat.Size()
|
||
readSize := 0
|
||
readBytes := make([]byte, 8192)
|
||
var hashHandle interface{}
|
||
switch hashType {
|
||
case "md5sum":
|
||
hashHandle = md5.New()
|
||
case "sha1sum":
|
||
hashHandle = sha1.New()
|
||
case "sha256sum":
|
||
hashHandle = sha256.New()
|
||
case "sha512sum":
|
||
hashHandle = sha512.New()
|
||
case "sha3sum224":
|
||
hashHandle = sha3.New224()
|
||
case "sha3sum256":
|
||
hashHandle = sha3.New256()
|
||
case "sha3sum384":
|
||
hashHandle = sha3.New384()
|
||
case "sha3sum512":
|
||
hashHandle = sha3.New512()
|
||
}
|
||
printLength := 0
|
||
for {
|
||
n, err := fileOpen.Read(readBytes)
|
||
if err != nil {
|
||
break
|
||
}
|
||
readSize += n
|
||
hashHandle.(hash.Hash).Write(readBytes[:n])
|
||
if 0 == readSize%67108864 {
|
||
printMsg := fmt.Sprintf(msg, float64(readSize)/float64(fileSize)*100, fileStat.Name())
|
||
printMsgLength := len(printMsg)
|
||
if printLength > printMsgLength {
|
||
printMsg += strings.Repeat(" ", printLength-printMsgLength)
|
||
}
|
||
fmt.Print(printMsg)
|
||
_ = os.Stdout.Sync()
|
||
printLength = len(printMsg)
|
||
}
|
||
}
|
||
printMsg := fmt.Sprintf(success, hashHandle.(hash.Hash).Sum(nil), hashFile)
|
||
printMsgLength := len(printMsg)
|
||
if printLength > printMsgLength {
|
||
printMsg += strings.Repeat(" ", printLength-printMsgLength)
|
||
}
|
||
fmt.Print(printMsg)
|
||
_ = os.Stdout.Sync()
|
||
}
|
||
|
||
func GetFileName() string {
|
||
filePath, _ := os.Executable()
|
||
fileName := filepath.Base(filePath)
|
||
fileName = strings.TrimSuffix(fileName, filepath.Ext(fileName))
|
||
return fileName
|
||
}
|
||
|
||
func GetFileList(args []string) (fileList []string) {
|
||
var tempList []string
|
||
for _, v := range args {
|
||
globList, _ := filepath.Glob(v)
|
||
tempList = append(tempList, globList...)
|
||
}
|
||
sort.Strings(tempList)
|
||
for i := 0; i < len(tempList); i++ {
|
||
if i > 0 && tempList[i] == tempList[i-1] {
|
||
continue
|
||
}
|
||
fileList = append(fileList, tempList[i])
|
||
}
|
||
return
|
||
}
|
||
|
||
func InstallShortcut(dst string) {
|
||
execPath, err := os.Executable()
|
||
if err != nil {
|
||
return
|
||
}
|
||
filePath, err := filepath.Abs(dst)
|
||
if err != nil {
|
||
return
|
||
}
|
||
fileStat, err := os.Stat(filePath)
|
||
if err != nil || !fileStat.IsDir() {
|
||
return
|
||
}
|
||
osPathSeparator := string(os.PathSeparator)
|
||
if !strings.HasSuffix(filePath, osPathSeparator) {
|
||
filePath += osPathSeparator
|
||
}
|
||
for i := 0; i < len(typeList); i++ {
|
||
symlinkPath := filePath + typeList[i]
|
||
if "windows" == runtime.GOOS {
|
||
symlinkPath += ".exe"
|
||
}
|
||
err := os.Link(execPath, symlinkPath)
|
||
if err != nil {
|
||
fmt.Printf("为 %s\t<<===>>\t%s 创建链接错误\n", symlinkPath, execPath)
|
||
} else {
|
||
fmt.Printf("为 %s\t<<===>>\t%s 创建了硬链接\n", symlinkPath, execPath)
|
||
}
|
||
}
|
||
}
|
||
|
||
func AuthorInformation() {
|
||
fmt.Println("welcome to our website https://aite.xyz/")
|
||
fmt.Println("----------------------------------------")
|
||
fmt.Println("腾讯扣扣:88966001")
|
||
fmt.Println("电子邮箱:xiaoqidun@gmail.com")
|
||
fmt.Println("----------------------------------------")
|
||
}
|