增加交并计算功能

This commit is contained in:
algotao
2025-11-05 16:41:06 +08:00
parent 869bae0a9e
commit 44d9206b9f
10 changed files with 950 additions and 12 deletions

81
and.go Normal file
View File

@@ -0,0 +1,81 @@
package main
import (
"flag"
"log/slog"
"git.algo.com.cn/public/bloomtool/internal/bloom"
)
func RunAnd(args ...string) error {
fs := flag.NewFlagSet("and", flag.ExitOnError)
bmpFile1 := fs.String("b1", "", "first bitmap filename")
bmpFile2 := fs.String("b2", "", "second bitmap filename")
outFile := fs.String("o", "", "output bitmap filename")
if err := fs.Parse(args); err != nil {
return err
} else if fs.NArg() > 0 || *bmpFile1 == "" || *bmpFile2 == "" || *outFile == "" {
fs.Usage()
return nil
}
return andOperation(*bmpFile1, *bmpFile2, *outFile)
}
func andOperation(bmpFile1, bmpFile2, outFile string) error {
// 加载第一个bitmap文件
slog.Info("load first bitmap file", "filename", bmpFile1)
bf1, err := bloom.LoadFromFile(bmpFile1, false)
if err != nil {
slog.Error("load first bitmap file error", "err", err)
return err
}
// 加载第二个bitmap文件
slog.Info("load second bitmap file", "filename", bmpFile2)
bf2, err := bloom.LoadFromFile(bmpFile2, false)
if err != nil {
slog.Error("load second bitmap file error", "err", err)
return err
}
// 检查参数一致性
stat1 := bf1.GetStat()
stat2 := bf2.GetStat()
slog.Info("first bitmap info", "elements", stat1.ElementsMax, "falseRate", stat1.FalsePositiveRate)
slog.Info("second bitmap info", "elements", stat2.ElementsMax, "falseRate", stat2.FalsePositiveRate)
if stat1.ElementsMax != stat2.ElementsMax {
slog.Error("elements count mismatch", "file1", stat1.ElementsMax, "file2", stat2.ElementsMax)
return flag.ErrHelp
}
if stat1.FalsePositiveRate != stat2.FalsePositiveRate {
slog.Error("false positive rate mismatch", "file1", stat1.FalsePositiveRate, "file2", stat2.FalsePositiveRate)
return flag.ErrHelp
}
// 执行AND运算
slog.Info("perform AND operation")
result, err := bf1.And(bf2)
if err != nil {
slog.Error("AND operation error", "err", err)
return err
}
// 保存结果
slog.Info("save result bitmap file", "filename", outFile)
err = result.SaveToFile(outFile)
if err != nil {
slog.Error("save result bitmap file error", "err", err)
return err
}
resultStat := result.GetStat()
slog.Info("AND operation completed", "resultElements", resultStat.ElementsAdded)
return nil
}