mirror of
https://github.com/xiaoqidun/ihash.git
synced 2024-11-01 00:38:50 +08:00
238 lines
4.7 KiB
Go
238 lines
4.7 KiB
Go
package main
|
||
|
||
import (
|
||
"bytes"
|
||
"crypto/md5"
|
||
"crypto/sha1"
|
||
"crypto/sha256"
|
||
"crypto/sha512"
|
||
"flag"
|
||
"fmt"
|
||
"golang.org/x/crypto/sha3"
|
||
"hash"
|
||
"io"
|
||
"io/ioutil"
|
||
"os"
|
||
"path/filepath"
|
||
"runtime"
|
||
"sort"
|
||
"strings"
|
||
)
|
||
|
||
const (
|
||
md5sum = "md5sum"
|
||
sha1sum = "sha1sum"
|
||
sha256sum = "sha256sum"
|
||
sha384sum = "sha384sum"
|
||
sha512sum = "sha512sum"
|
||
sha3sum224 = "sha3sum224"
|
||
sha3sum256 = "sha3sum256"
|
||
sha3sum384 = "sha3sum384"
|
||
sha3sum512 = "sha3sum512"
|
||
)
|
||
|
||
var (
|
||
args []string
|
||
author bool
|
||
install string
|
||
)
|
||
|
||
var typeList = []string{
|
||
md5sum,
|
||
sha1sum,
|
||
sha256sum,
|
||
sha384sum,
|
||
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 sha384sum:
|
||
sum = sha512.Sum384(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) {
|
||
success := "%x %s"
|
||
fileOpen, err := os.Open(hashFile)
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer func() {
|
||
_ = fileOpen.Close()
|
||
}()
|
||
fileStat, err := fileOpen.Stat()
|
||
if err != nil || fileStat.IsDir() {
|
||
return
|
||
}
|
||
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 sha384sum:
|
||
hashHandle = sha512.New384()
|
||
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()
|
||
}
|
||
for {
|
||
n, err := fileOpen.Read(readBytes)
|
||
if err != nil {
|
||
if err == io.EOF && n > 0 {
|
||
hashHandle.(hash.Hash).Write(readBytes[:n])
|
||
}
|
||
break
|
||
}
|
||
hashHandle.(hash.Hash).Write(readBytes[:n])
|
||
}
|
||
fmt.Println(fmt.Sprintf(success, hashHandle.(hash.Hash).Sum(nil), hashFile))
|
||
}
|
||
|
||
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("----------------------------------------")
|
||
}
|