A:增加 Hash 运行速度测试,基于结果使用 Sha256

This commit is contained in:
jimmy committed 2025-06-17 15:39:09 +08:00
1 parent ae8f64d53b
commit 77fb95b967
2 files changed
+68 -150

No files matched your search

+67 -147
View File
@@ -1,164 +1,84 @@
package utils
import (
"crypto/rand"
"fmt"
"log"
"os"
"testing"
"time"
)
func main() {
// 1. 计算字符串Hash
fmt.Println("=== 字符串Hash ===")
text := "Hello, World!"
fmt.Printf("MD5: %s\n", MD5String(text))
fmt.Printf("SHA256: %s\n", SHA256String(text))
const (
fileName = "temp_rand_1GB.bin"
fileSize = 1 << 30 // 1GB = 2^30
bufSize = 4 << 20 // 4MB buffer
)
// 2. 计算单个文件Hash
fmt.Println("\n=== 单个文件Hash ===")
filename := "example.txt"
if hash, err := SHA256File(filename); err != nil {
log.Printf("计算文件Hash失败: %v", err)
} else {
fmt.Printf("文件 %s 的 SHA256: %s\n", filename, hash)
}
// 3. 带进度的文件Hash计算
fmt.Println("\n=== 带进度的Hash计算 ===")
progressCallback := func(processed, total int64) {
percentage := float64(processed) / float64(total) * 100
fmt.Printf("\r进度: %.2f%% (%d/%d bytes)", percentage, processed, total)
}
if hash, err := HashFileWithProgress(filename, SHA256, progressCallback); err != nil {
log.Printf("计算失败: %v", err)
} else {
fmt.Printf("\n最终Hash: %s\n", hash)
}
// 4. 并发计算多个文件
fmt.Println("\n=== 并发计算多个文件 ===")
files := []string{"file1.txt", "file2.txt", "file3.txt"}
results := HashMultipleFiles(files, SHA256)
for _, result := range results {
if result.Error != nil {
fmt.Printf("文件 %s 计算失败: %v\n", result.Filename, result.Error)
} else {
fmt.Printf("文件 %s (%.2f KB): %s\n",
result.Filename,
float64(result.Size)/1024,
result.Hash)
}
}
// 5. 计算目录下所有文件
// fmt.Println("\n=== 目录Hash计算 ===")
// dirResults, err := HashDirectory("./testdir", SHA256, true)
// if err != nil {
// log.Printf("计算目录Hash失败: %v", err)
// } else {
// for _, result := range dirResults {
// if result.Error == nil {
// fmt.Printf("%s: %s\n", result.Filename, result.Hash)
// }
// }
// }
// 6. 查找重复文件
fmt.Println("\n=== 查找重复文件 ===")
allFiles := []string{"file1.txt", "file2.txt", "file3.txt", "file1_copy.txt"}
duplicates := FindDuplicates(allFiles, SHA256)
for hash, files := range duplicates {
fmt.Printf("Hash %s 的重复文件:\n", hash[:16]+"...")
for _, file := range files {
fmt.Printf(" - %s\n", file)
}
}
// 7. 比较两个文件
fmt.Println("\n=== 文件比较 ===")
if same, err := CompareFiles("file1.txt", "file2.txt", SHA256); err != nil {
log.Printf("文件比较失败: %v", err)
} else {
if same {
fmt.Println("两个文件内容相同")
} else {
fmt.Println("两个文件内容不同")
}
}
// 8. 验证文件完整性
fmt.Println("\n=== 文件完整性验证 ===")
expectedHash := "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" // 空文件的SHA256
if valid, err := VerifyFileIntegrity("empty.txt", expectedHash, SHA256); err != nil {
log.Printf("验证失败: %v", err)
} else {
if valid {
fmt.Println("文件完整性验证通过")
} else {
fmt.Println("文件完整性验证失败")
}
}
// 9. 多算法同时计算
fmt.Println("\n=== 多算法Hash计算 ===")
hashTypes := []HashType{
MD5,
SHA1,
SHA256,
SHA512,
}
multiHashes, err := HashFileMultipleAlgorithms(filename, hashTypes)
func createRandomFile(path string, size int64) error {
f, err := os.Create(path)
if err != nil {
log.Printf("多算法计算失败: %v", err)
} else {
for algorithm, hash := range multiHashes {
fmt.Printf("%s: %s\n", algorithm, hash)
return err
}
defer f.Close()
buf := make([]byte, bufSize)
var written int64
for written < size {
n, err := rand.Read(buf)
if err != nil {
return err
}
if n == 0 {
break
}
w, err := f.Write(buf[:n])
if err != nil {
return err
}
written += int64(w)
fmt.Printf("\rWritten: %.2f%%", float64(written)*100/float64(size))
}
// 10. 获取文件详细信息
// fmt.Println("\n=== 文件详细信息 ===")
// if fileInfo, err := GetFileInfo(filename, SHA256); err != nil {
// log.Printf("获取文件信息失败: %v", err)
// } else {
// fmt.Printf("文件名: %s\n", fileInfo.Name)
// fmt.Printf("路径: %s\n", fileInfo.Path)
// fmt.Printf("大小: %d bytes\n", fileInfo.Size)
// fmt.Printf("Hash类型: %s\n", fileInfo.HashType)
// fmt.Printf("Hash值: %s\n", fileInfo.Hash)
// }
// 11. 性能测试示例
fmt.Println("\n=== 性能测试 ===")
start := time.Now()
_, err = SHA256File("largefile.txt")
if err != nil {
log.Printf("大文件Hash计算失败: %v", err)
} else {
duration := time.Since(start)
fmt.Printf("大文件Hash计算耗时: %v\n", duration)
}
fmt.Println("\nFile generation done.")
return nil
}
// 创建测试文件的辅助函数
func createTestFiles() {
// 这个函数可以用来创建一些测试文件
testData := []struct {
filename string
content string
}{
{"file1.txt", "Hello World"},
{"file2.txt", "Go Programming"},
{"file3.txt", "Hash Utils Test"},
{"file1_copy.txt", "Hello World"}, // 与file1.txt内容相同
{"empty.txt", ""},
func TestMain(m *testing.M) {
fmt.Println("Creating 1GB random file...")
if err := createRandomFile(fileName, fileSize); err != nil {
fmt.Println("Error creating file:", err)
return
}
for _, test := range testData {
// 创建文件的代码...
fmt.Printf("需要创建测试文件: %s\n", test.filename)
fmt.Println("Testing SHA-256...")
for i := 0; i < 5; i++ {
start256 := time.Now()
sha256Time, err := SHA256File(fileName)
elapsed256 := time.Since(start256)
if err != nil {
fmt.Println("SHA-256 error:", err)
return
}
fmt.Printf("SHA-256: %v, Speed: %.2f MB/s use time: %v\n", sha256Time, float64(fileSize)/1024/1024/elapsed256.Seconds(), elapsed256)
}
fmt.Println("Testing SHA-512...")
for i := 0; i < 5; i++ {
start512 := time.Now()
sha512Time, err := SHA512File(fileName)
elapsed512 := time.Since(start512)
if err != nil {
fmt.Println("SHA-512 error:", err)
return
}
fmt.Printf("SHA-512: %v, Speed: %.2f MB/s use time: %v\n", sha512Time, float64(fileSize)/1024/1024/elapsed512.Seconds(), elapsed512)
}
// 删除临时文件
if err := os.Remove(fileName); err != nil {
fmt.Println("Failed to delete test file:", err)
} else {
fmt.Println("Temporary file deleted.")
}
}
+1 -3
View File
@@ -1,8 +1,6 @@
package utils
import (
"testing"
)
import "testing"
func TestSysUtils(t *testing.T) {
sys_u := NewSysUtils()