{"id":43017405,"url":"https://github.com/clarkthan/ahocorasick","last_synced_at":"2026-05-24T06:01:36.740Z","repository":{"id":64301611,"uuid":"573756311","full_name":"ClarkThan/ahocorasick","owner":"ClarkThan","description":"Golang implementation of Aho-Corasick algorithm.","archived":false,"fork":false,"pushed_at":"2023-10-11T04:25:07.000Z","size":29,"stargazers_count":4,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-31T19:10:32.666Z","etag":null,"topics":["ac","aho-corasick","aho-corasick-algorithm","ahocorasick","go","golang"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/ClarkThan/ahocorasick","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ClarkThan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-03T10:34:46.000Z","updated_at":"2025-04-10T10:09:27.000Z","dependencies_parsed_at":"2023-10-11T06:36:50.405Z","dependency_job_id":null,"html_url":"https://github.com/ClarkThan/ahocorasick","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ClarkThan/ahocorasick","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClarkThan%2Fahocorasick","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClarkThan%2Fahocorasick/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClarkThan%2Fahocorasick/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClarkThan%2Fahocorasick/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ClarkThan","download_url":"https://codeload.github.com/ClarkThan/ahocorasick/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClarkThan%2Fahocorasick/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33423284,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"online","status_checked_at":"2026-05-24T02:00:06.296Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ac","aho-corasick","aho-corasick-algorithm","ahocorasick","go","golang"],"created_at":"2026-01-31T06:10:28.850Z","updated_at":"2026-05-24T06:01:36.734Z","avatar_url":"https://github.com/ClarkThan.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Aho-Corasick\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/ClarkThan/ahocorasick.svg)](https://pkg.go.dev/github.com/ClarkThan/ahocorasick)\n[![Go Report Card](https://goreportcard.com/badge/github.com/ClarkThan/ahocorasick)](https://goreportcard.com/report/github.com/ClarkThan/ahocorasick)\n\nPackage `ahocorasick` provides a pure Go implementation of the [Aho-Corasick](https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm) multiple pattern string matching algorithm.\n\n**Efficiently find all occurrences of many patterns in a text in O(n + m + z) time** — where n is the text length, m is the total pattern length, and z is the number of matches. Build once, search many times.\n\n## Features\n\n- **Multiple pattern search** — find all dictionary words in a text in a single pass\n- **Unicode support** — works with any UTF-8 text, including CJK characters\n- **No external dependencies** — pure Go standard library only\n- **Buffer-reuse API** — `SearchAppend` / `SearchIndexedAppend` for zero-allocation hot loops\n\n## Install\n\n```bash\ngo get github.com/ClarkThan/ahocorasick\n```\n\n**Go version**: 1.18+\n\n## Quick Start\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/ClarkThan/ahocorasick\"\n)\n\nfunc main() {\n    m := ahocorasick.NewMatcher()\n    m.BuildWithPatterns([]string{\"she\", \"he\", \"hers\"})\n\n    // Search returns matched pattern strings\n    fmt.Println(m.Search(\"shers\"))\n    // Output: [she he hers]\n\n    // SearchIndexed returns start positions and lengths\n    fmt.Println(m.SearchIndexed(\"shers\"))\n    // Output: [{0 3} {1 2} {3 4}]\n\n    // Match checks whether any pattern exists\n    fmt.Println(m.Match(\"shers\"))  // true\n    fmt.Println(m.Match(\"foo\"))    // false\n}\n```\n\n## API\n\n### Lifecycle\n\n```go\nm := ahocorasick.NewMatcher()        // create\nm.AddPattern(\"foo\")                   // add patterns one by one\nm.AddPattern(\"bar\")\nm.Build()                             // build trie and fail pointers\n\nm.BuildWithPatterns([]string{...})    // or add + build in one call\n\nm.Search(text)                        // search (must Build first)\nm.SearchIndexed(text)\nm.Match(text)\n```\n\n### Methods\n\n| Method | Returns | Description |\n|---|---|---|\n| `NewMatcher()` | `*Matcher` | Create a new matcher |\n| `AddPattern(pattern)` | — | Add a pattern; sets `ready = false` |\n| `Build()` | — | Build fail pointers after adding patterns |\n| `BuildWithPatterns(patterns)` | — | Convenience: `AddPattern` + `Build` |\n| `Search(s)` | `[]string` | Return matched pattern strings |\n| `SearchIndexed(s)` | `[]Hit` | Return `Hit{Start, Len}` for each match |\n| `Match(s)` | `bool` | Return true if any pattern matches |\n| `SearchAppend(s, buf)` | `[]string` | Append matches to caller-owned buffer |\n| `SearchIndexedAppend(s, buf)` | `[]Hit` | Append hits to caller-owned buffer |\n\n### Buffer Reuse (Hot Loop Optimization)\n\nIn tight loops, reuse a pre-allocated buffer to eliminate allocations:\n\n```go\nm.BuildWithPatterns([]string{\"foo\", \"bar\", \"baz\"})\n\n// pre-allocate once\nbuf := make([]string, 0, 64)\n\ntexts := []string{\"foo bar\", \"bar baz\", \"baz foo\"}\nfor _, t := range texts {\n    buf = m.SearchAppend(t, buf[:0])  // reuse capacity, zero allocs\n    fmt.Println(buf)\n}\n```\n\nSame pattern applies to `SearchIndexedAppend` with `[]Hit`.\n\n## Performance\n\nAll benchmarks on Apple M1 Pro with 10 patterns (~120 char text).\n\n| Scenario | Time (ns/op) | Memory (B/op) | Allocs/op |\n|---|---|---|---|\n| `Search` single call | 3689 | 1968 | 31 |\n| `SearchAppend` with pre-allocated buffer | 3475 (−6%) | 960 (−51%) | 25 (−19%) |\n| `Search` 10 calls, fresh alloc each | 9354 | 4240 | 97 |\n| `SearchAppend`, buffer reused across 10 calls | 8401 (−10%) | 2224 (−48%) | 61 (−37%) |\n| `SearchIndexed` single call | 3077 | 1776 | 7 |\n| `SearchIndexedAppend` with pre-allocated buffer | 2527 (−18%) | 768 (−57%) | 1 (−86%) |\n| `SearchIndexed` 10 calls, fresh alloc each | 7646 | 3824 | 46 |\n| `SearchIndexedAppend`, buffer reused across 10 calls | 6658 (−13%) | 1808 (−53%) | 10 (−78%) |\n\n\u003e Use `SearchAppend` / `SearchIndexedAppend` with a reused buffer for the best performance in loop scenarios.\n\n## Why Aho-Corasick?\n\nTraditional approaches to multi-pattern search have trade-offs:\n\n- **Naïve loop**: O(k·n) — scan text once per pattern, slow with many patterns\n- **Regex**: depends on engine, often backtracking, unpredictable\n- **Aho-Corasick**: O(n + m + z) — scans text **once**, total time grows linearly with input size regardless of pattern count\n\nChoose this library when you have a fixed set of patterns and need to search them against many texts.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclarkthan%2Fahocorasick","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclarkthan%2Fahocorasick","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclarkthan%2Fahocorasick/lists"}