agnivade/levenshtein
GitHub: agnivade/levenshtein
Go 语言实现的高性能 Levenshtein 编辑距离计算库,支持非 ASCII 字符串,在速度和内存分配上优于同类库。
Stars: 471 | Forks: 31
# levenshtein  [](https://goreportcard.com/report/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分析, 日志审计