81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package file
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"io"
|
|
"math"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// Get info of block
|
|
func GetBlockInfo(fileSize int64) (blockSize int, length int) {
|
|
switch {
|
|
case fileSize <= 1<<28: //256M
|
|
blockSize = 1 << 17 //128kb
|
|
case fileSize <= 1<<29: //512M
|
|
blockSize = 1 << 18 //256kb
|
|
case fileSize <= 1<<30: //1G
|
|
blockSize = 1 << 19 //512kb
|
|
case fileSize <= 1<<31: //2G
|
|
blockSize = 1 << 20 //(mb)
|
|
case fileSize <= 1<<32: //4G
|
|
blockSize = 1 << 21 //2mb
|
|
case fileSize <= 1<<33: //8G
|
|
blockSize = 1 << 22 //4mb
|
|
case fileSize <= 1<<34: //16g
|
|
blockSize = 1 << 23 //8mb
|
|
default:
|
|
blockSize = 1 << 24 //16mb
|
|
}
|
|
temp := float64(fileSize) / float64(blockSize)
|
|
length = int(math.Ceil(temp))
|
|
return
|
|
}
|
|
|
|
//get the hash of the data
|
|
func GetHashByContent(data []byte) string {
|
|
sum := md5.Sum(data)
|
|
return hex.EncodeToString(sum[:])
|
|
}
|
|
|
|
//get the hash of the data
|
|
func GetHashByPath(path string) string {
|
|
pFile, err := os.Open(path)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
defer pFile.Close()
|
|
md5h := md5.New()
|
|
io.Copy(md5h, pFile)
|
|
return hex.EncodeToString(md5h.Sum(nil))
|
|
}
|
|
|
|
//Comparison data hash
|
|
func ComparisonHash(data []byte, hash string) bool {
|
|
sum := md5.Sum(data)
|
|
return hex.EncodeToString(sum[:]) == hash
|
|
}
|
|
|
|
//get prefix byte length
|
|
func PrefixLength(byteLength int) []byte {
|
|
lengthByte := []byte{'0', '0', '0', '0', '0', '0'}
|
|
bSize := strconv.Itoa(byteLength)
|
|
cha := 6 - len(bSize)
|
|
for i := len(bSize); i > 0; i-- {
|
|
lengthByte[cha+i-1] = bSize[i-1]
|
|
}
|
|
return lengthByte
|
|
}
|
|
|
|
//get data byte length
|
|
func DataLength(length int) []byte {
|
|
lengthByte := []byte{'0', '0', '0', '0', '0', '0', '0', '0'}
|
|
bSize := strconv.Itoa(length)
|
|
cha := 8 - len(bSize)
|
|
for i := len(bSize); i > 0; i-- {
|
|
lengthByte[cha+i-1] = bSize[i-1]
|
|
}
|
|
return lengthByte
|
|
}
|