agnivade/levenshtein

GitHub: agnivade/levenshtein

Go 语言实现的高性能 Levenshtein 编辑距离计算库,支持非 ASCII 字符串,在速度和内存分配上优于同类库。

Stars: 471 | Forks: 31

# levenshtein ![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg) [![Go Report Card](https://goreportcard.com/badge/github.com/agnivade/levenshtein)](https://goreportcard.com/report/github.com/agnivade/levenshtein) [![PkgGoDev](https://pkg.go.dev/badge/github.com/agnivade/levenshtein)](https://pkg.go.dev/github.com/agnivade/levenshtein) 用于计算 [Levenshtein Distance](http://en.wikipedia.org/wiki/Levenshtein_distance) 的 [Go](http://golang.org) 包 该库完全能够处理非 ASCII 字符串。但字符串不会被规范化。这被视为依赖于用户的具体使用场景。如果您有此类需求,请在将字符串传递给库之前对其进行规范化。 - https://blog.golang.org/normalization #### 限制 作为一种性能优化,该库最多只能处理 65536 个字符(runes)的字符串。如果您需要处理更长的字符串,请锁定到 1.0.3 版本。 ## 安装 ``` go get github.com/agnivade/levenshtein ``` ## 示例 ``` package main import ( "fmt" "github.com/agnivade/levenshtein" ) func main() { s1 := "kitten" s2 := "sitting" distance := levenshtein.ComputeDistance(s1, s2) fmt.Printf("The distance between %s and %s is %d.\n", s1, s2, distance) // Output: // The distance between kitten and sitting is 3. } ``` ## 基准测试 ``` goos: darwin goarch: arm64 pkg: github.com/agnivade/levenshtein cpu: Apple M4 │ bench.out │ │ sec/op │ Simple/ASCII-10 123.8n ± 0% Simple/French-10 212.6n ± 1% Simple/Nordic-10 365.9n ± 0% Simple/Long_lead-10 224.5n ± 0% Simple/Long_middle-10 379.9n ± 0% Simple/Long_trail-10 580.8n ± 0% Simple/Long_diff-10 8.008µ ± 0% Simple/Tibetan-10 459.5n ± 0% geomean 452.4n │ bench.out │ │ B/op │ Simple/ASCII-10 0.000 ± 0% Simple/French-10 0.000 ± 0% Simple/Nordic-10 0.000 ± 0% Simple/Long_lead-10 368.0 ± 0% Simple/Long_middle-10 544.0 ± 0% Simple/Long_trail-10 576.0 ± 0% Simple/Long_diff-10 720.0 ± 0% Simple/Tibetan-10 0.000 ± 0% geomean ¹ ¹ summaries must be >0 to compute geomean │ bench.out │ │ allocs/op │ Simple/ASCII-10 0.000 ± 0% Simple/French-10 0.000 ± 0% Simple/Nordic-10 0.000 ± 0% Simple/Long_lead-10 2.000 ± 0% Simple/Long_middle-10 2.000 ± 0% Simple/Long_trail-10 2.000 ± 0% Simple/Long_diff-10 3.000 ± 0% Simple/Tibetan-10 0.000 ± 0% geomean ¹ ¹ summaries must be >0 to compute geomean ``` ## 与其他库的比较 ### github.com/dgryski/trifles ``` goos: darwin goarch: arm64 pkg: github.com/agnivade/levenshtein cpu: Apple M4 │ dgryski │ agniva │ │ sec/op │ sec/op vs base │ All/case=ASCII-10 288.4n ± 0% 123.9n ± 1% -57.05% (p=0.000 n=20) All/case=French-10 518.8n ± 0% 211.7n ± 1% -59.20% (p=0.000 n=20) All/case=Nordic-10 963.8n ± 0% 369.4n ± 1% -61.67% (p=0.000 n=20) All/case=Tibetan-10 795.6n ± 0% 460.1n ± 0% -42.18% (p=0.000 n=20) geomean 582.0n 258.4n -55.60% │ dgryski │ agniva │ │ B/op │ B/op vs base │ All/case=ASCII-10 96.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=20) All/case=French-10 128.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=20) All/case=Nordic-10 192.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=20) All/case=Tibetan-10 160.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=20) geomean 139.4 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean │ dgryski │ agniva │ │ allocs/op │ allocs/op vs base │ All/case=ASCII-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) All/case=French-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) All/case=Nordic-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) All/case=Tibetan-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) geomean 1.000 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean ``` ### github.com/arbovm/levenshtein ``` goos: darwin goarch: arm64 pkg: github.com/agnivade/levenshtein cpu: Apple M4 │ arbovm │ agniva │ │ sec/op │ sec/op vs base │ All/case=ASCII-10 283.1n ± 1% 123.9n ± 1% -56.23% (p=0.000 n=20) All/case=French-10 516.4n ± 0% 211.7n ± 1% -59.01% (p=0.000 n=20) All/case=Nordic-10 978.9n ± 0% 369.4n ± 1% -62.26% (p=0.000 n=20) All/case=Tibetan-10 804.9n ± 0% 460.1n ± 0% -42.84% (p=0.000 n=20) geomean 582.6n 258.4n -55.65% │ arbovm │ agniva │ │ B/op │ B/op vs base │ All/case=ASCII-10 96.00 ± 0% 0.00 ± 0% -100.00% (p=0.000 n=20) All/case=French-10 128.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=20) All/case=Nordic-10 192.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=20) All/case=Tibetan-10 160.0 ± 0% 0.0 ± 0% -100.00% (p=0.000 n=20) geomean 139.4 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean │ arbovm │ agniva │ │ allocs/op │ allocs/op vs base │ All/case=ASCII-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) All/case=French-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) All/case=Nordic-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) All/case=Tibetan-10 1.000 ± 0% 0.000 ± 0% -100.00% (p=0.000 n=20) geomean 1.000 ? ¹ ² ¹ summaries must be >0 to compute geomean ² ratios must be >0 to compute geomean ```
标签:EVTX分析, 日志审计