Skip to main content

StringZilla ๐Ÿฆ–

StringZilla banner

Strings are the first fundamental data type every programming language implements in software rather than hardware โ€” the closest CPUs come to a "find substring" instruction is x86's PCMPISTRI, which is too slow and too narrow to build a library on, and nothing ships a "compute string hash" instruction at all. So most string-processing code still looks like for (i = 0; i < length; ++i) if (text[i] == 'x') โ€ฆ โ€” a tangle of loops, branches, and per-character lookups, where the surrounding control flow often costs more than the character-level logic itself, whether the text is ASCII or UTF-8 encoded Unicode. Worse, chewing through one byte or codepoint at a time squanders the hardware: a modern CPU carries dozens of 16-64 byte architectural registers, and hundreds of physical ones to feed out-of-order execution. StringZilla reaches for those SIMD and SWAR instructions directly, offering one of the widest, fastest, and most portable collections of text-processing primitives anywhere.

StringZilla Python installs StringZilla Rust installs StringZilla code size

StringZilla is the GodZilla of string libraries, accelerating exact and fuzzy matching, hashing, edit distances, sorting, segmentation, and even random-string generation, with allocation-free lazily-evaluated iterators throughout.

  • It can be 3x faster than LibC doing substring search on Arm servers, and 9x on Apple Silicon, where the system strstr is weaker.
  • It can be 10-70x faster than ICU, both ICU4C and its Rust successor ICU4X, in UTF-8 handling, case folding, segmentation, and tokenization.
  • It can be over 10x faster than NVIDIA's own libraries for on-GPU Levenshtein, NW, and SW edit distances.
  • It comes with built-in custom WebAssembly backend for sandboxed browser, DBMS, & LLM environments, custom RVV backend for RISC-V CPUs, PowerPC backend for IBM Power servers, LoongArch for Chinese domestic chips, and more!

Reach for it from your language of choice:

  • ๐Ÿ‚ C: Upgrade LibC's <string.h> to <stringzilla/stringzilla.h> in C 99
  • ๐Ÿ‰ C++: Upgrade STL's <string> to <stringzilla/stringzilla.hpp> in C++ 11
  • ๐Ÿงฎ CUDA: Process in-bulk with <stringzillas/stringzillas.cuh> in CUDA C++ 17
  • ๐Ÿ Python: Upgrade your str to faster Str
  • ๐Ÿฆ€ Rust: Use the StringZilla traits crate
  • ๐Ÿฆซ Go: Use the StringZilla cGo module
  • ๐ŸŽ Swift: Use the String+StringZilla extension
  • ๐ŸŸจ JavaScript: Use the StringZilla library
  • ๐Ÿ’œ C#: Zero-copy over ReadOnlySpan<byte>, NativeAOT-friendly
  • โ˜• Java: Pure FFM API over MemorySegment, no JNI
  • ๐Ÿš Shell: Accelerate common CLI tools with sz- prefix
  • ๐Ÿ“š Researcher? Jump to Algorithms & Design Decisions
  • ๐Ÿ’ก Thinking to contribute? Look for "good first issues"
  • ๐Ÿค And check the guide to set up the environment
  • Want more bindings or features? Let me know!

Who is this for?

  • For data-engineers parsing large datasets, like the CommonCrawl, RedPajama, or LAION.
  • For software engineers optimizing strings in their apps and services.
  • For bioinformaticians and search engineers looking for edit-distances for USearch.
  • For DBMS devs, optimizing LIKE, ORDER BY, and GROUP BY operations.
  • For hardware designers, needing a SWAR baseline for string-processing functionality.
  • For students studying SIMD/SWAR applications to non-data-parallel operations.

Performance

Throughput and timings on two CPUs and one GPU, grouped by operation. Only the languages that ship a counterpart appear under each heading. StringZilla.C is the C kernel called directly; StringZilla.Py is the same kernel through the CPython binding, so the gap between them is the cost of crossing the interpreter boundary.

                                                      Xeon4    M5 Pro        H100
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Unicode case-insensitive substring search  (GB/s)
  Python          icu.StringSearch                     0.06      0.15
  StringZilla.C   sz_utf8_uncased_search              13.16      9.30
  StringZilla.Py  sz.utf8_uncased_search              12.40      9.19

Find the first occurrence of a random word, โ‰… 5 bytes  (GB/s)
  LibC            strstr                               21.3       3.5
  STL C++         std::string::find                     9.1      10.9
  Python          str.find                              2.5       3.1
  StringZilla.C   sz_find                              21.0      37.1
  StringZilla.Py  sz.find                              18.6      33.4

Split lines separated by \n or \r  (GB/s)
  LibC            strcspn                               9.2       3.8
  STL C++         std::string::find_first_of            1.1       4.1
  Python          re.finditer                          0.32      0.64
  StringZilla.C   sz_find_byteset                      13.8      23.7
  StringZilla.Py  sz.split_byteset_iter                11.2      21.7

Levenshtein distances, โ‰… 100 byte DNA, one core  (MCUPS)
  Python          rapidfuzz.process.cdist             4,970    18,370
  StringZilla.C   szs_levenshtein_distances          15,680    22,844   5,980,110
  StringZilla.Py  szs.LevenshteinDistances           14,130    21,930   4,074,700

Needleman-Wunsch scores, โ‰… 1 KB DNA, one core  (MCUPS)
  Python          Bio.Align.PairwiseAligner.score       430       870
  StringZilla.C   szs_needleman_wunsch_scores        12,000     1,267     701,760
  StringZilla.Py  szs.NeedlemanWunschScores          10,730     1,060     700,900

Treat these as a first impression, not a benchmark suite. The Unicode numbers were obtained on a 128 MB slice of multilingual XLSum; the similarity rows on synthetic DNA strings. Xeon4 is an Intel Sapphire Rapids with GCC and glibc, M5 Pro an 18-core Apple Silicon with Apple clang and libc++, H100 an Nvidia Hopper GPU. The two CPUs therefore differ in standard library as much as in ISA, which is most of the gap in the strstr, std::string::rfind, and bytes.translate rows; the StringZilla rows build from the same source on both. These will not reproduce exactly; the links below carry the methodology and the per-library breakdowns.

Most StringZilla modules ship ready-to-run benchmarks for C, C++, Python, and more. Grab them from ./scripts, and see CONTRIBUTING.md, test/README.md, and bench/README.md for instructions. For wider head-to-heads against Rust and Python favorites, browse the StringWars repository. To inspect collision resistance and distribution shapes for our hashers, see HashEvals.

Why StringZilla

There are several other excellent libraries with overlapping subsets of operations and somewhat different design philosophies. LibC obviously provides a good baseline for basic memory operations, but its APIs vary widely in quality, and its Arm implementations often trail its x86 ones. ICU and ICU4X implement the Unicode standard to a letter, but don't exploit hidden invariants in the Unicode ruleset to vectorize those operations. RapidFuzz comes with a very good set of string-similarity algorithms and is already well vectorized on CPUs, but leaves batched cross-products symmetries and massive GPU speedups on the table. xxHash and aHash provide great non-cryptographic hashes, but may not cover all of the hashing use cases, or leverage the wider AES and predicated instructions available on modern CPUs.

Because StringZilla mirrors the familiar standard APIs, adoption is mostly a search-and-replace.

                           Standard                  StringZilla
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
Python
  Find a substring         "...".find(x)             sz.find("...", x)
  Sort strings             sorted(items)             sz.Strs(items).sorted()
  Split on a separator     "...".split(sep)          sz.Str("...").split(sep)
  Case-fold for matching   "...".casefold()          sz.utf8_uncased_fold("...")
  Streaming SHA-256        hashlib.sha256()          sz.Sha256()

C++
  Find a substring         std::string::find         sz::string::find
  Sort a collection        std::sort of indices      sz::argsort
  Intersect string sets    std::set_intersection     sz::try_intersect
  Hash map, string keys    std::unordered_map<K, V>  sz::hash + sz::equal_to

Functionality

StringZilla is compatible with most modern CPUs, and provides a broad range of functionality. It's split into 2 layers:

  1. StringZilla: single-header C library and C++ wrapper for high-performance string operations.
  2. StringZillas: parallel CPU/GPU backends used for large-batch operations and accelerators.

Having a second C++/CUDA layer greatly simplifies the implementation of similarity scoring and fingerprinting functions, which would otherwise require too much error-prone boilerplate code in pure C. Both layers are designed to be extremely portable:

  • across both little-endian and big-endian architectures.
  • across 32-bit and 64-bit hardware architectures.
  • across operating systems and compilers.
  • across ASCII and UTF-8 encoded inputs.

Not all features are available across all bindings. Consider contributing if you need a feature that's not yet implemented.

Maturity C C++ Python Rust JS Swift Go C# Java
Substring Search ๐ŸŒณ โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Character Set Search ๐ŸŒณ โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Sorting & Sequence Operations ๐ŸŒณ โœ… โœ… โœ… โœ… โšช โšช โšช โœ… โœ…
Set Intersection & Joins ๐Ÿง โœ… โœ… โœ… โœ… โšช โšช โšช โœ… โœ…
Lazy Ranges, Compressed Arrays ๐ŸŒณ โŒ โœ… โœ… โœ… โŒ โšช โšช โœ… โœ…
One-Shot & Streaming Hashes ๐ŸŒณ โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Cryptographic Hashes ๐ŸŒณ โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Small String Class ๐Ÿง โœ… โœ… โŒ โšช โŒ โŒ โŒ โŒ โŒ
Random String Generation ๐ŸŒณ โœ… โœ… โœ… โœ… โšช โšช โšช โœ… โœ…
Unicode Case Folding ๐Ÿง โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Uncased UTF-8 Search ๐Ÿšง โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
TR29 Word Boundary Detection ๐Ÿšง โœ… โœ… โœ… โœ… โœ… โœ… โšช โœ… โœ…
TR29 Grapheme Segmentation ๐Ÿšง โœ… โœ… โœ… โœ… โœ… โšช โšช โœ… โœ…
TR29 Sentence Segmentation ๐Ÿšง โœ… โœ… โœ… โœ… โœ… โšช โšช โœ… โœ…
UAX14 Line-Break Detection ๐Ÿšง โœ… โœ… โœ… โœ… โœ… โšช โšช โœ… โœ…
Unicode Normalization ๐Ÿšง โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Codepoint Counting & Indexing ๐ŸŒณ โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ… โœ…
Parallel Similarity Scoring ๐ŸŒณ โœ… โœ… โœ… โœ… โšช โšช โšช โšช โšช
Parallel Rolling Fingerprints ๐ŸŒณ โœ… โœ… โœ… โœ… โšช โšช โšช โšช โšช

๐ŸŒณ parts are used in production. ๐Ÿง parts are in beta. ๐Ÿšง parts are under active development, and are likely to break in subsequent releases. โœ… are implemented. โšช are considered. โŒ are not intended.

Quick Start

Each binding has its own install command, import line, and dedicated guide, all collected in the per-language sections below. The batch and GPU engines ship separately, as stringzillas-cpus and stringzillas-cuda on PyPI and the cpus and cuda crate features; each binding's guide covers the details.

Python

pip install stringzilla ยท guide: python/README.md

import stringzilla as sz

text = sz.Str("the quick brown fox")
text.find("brown")          # 10
text.split()                # Strs(['the', 'quick', 'brown', 'fox'])
sz.hash("hello")            # fast 64-bit hash

The Python package upgrades str and bytes with SIMD search, sorting, hashing, UTF-8 segmentation, and Unicode case-folding, plus the batch-parallel stringzillas engines for edit distances and rolling fingerprints.

C and C++

Header-only, or pull it in with CMake FetchContent, or find_package(stringzilla) an installed build ยท guides: include/stringzilla/README.md and include/stringzillas/README.md

#include <stringzilla/stringzilla.h>
sz_find(haystack, h_length, "brown", 5); // pointer to the match, or NULL
#include <stringzilla/stringzilla.hpp>
namespace sz = ashvardanian::stringzilla;
sz::string_view("the quick brown fox").find("brown"); // 10

The header-only library covers search, hashing, sorting, comparison, set intersection, memory operations, and lazy UTF-8 segmentation; the bulk and GPU engines for edit distances, alignment scores, and fingerprints live in the companion stringzillas distribution.

Rust

cargo add stringzilla ยท guide: rust/README.md

use stringzilla::sz;

assert_eq!(sz::find("the quick brown fox", "brown"), Some(10));
let digest = sz::hash("hello"); // fast 64-bit hash

The crate adds SIMD search, sorting, hashing, and UTF-8 segmentation to any AsRef<[u8]>, with the optional stringzillas engines for batch edit distances and rolling fingerprints.

JavaScript

npm install stringzilla ยท guide: javascript/README.md

import sz from "stringzilla";

sz.find(Buffer.from("the quick brown fox"), Buffer.from("brown")); // => 10n
sz.hash(Buffer.from("hello"));                                     // 64-bit BigInt

The Node-API addon runs on Node, Bun, and Deno, exposing zero-copy search, hashing, SHA-256, and Unicode case-folding over Buffer objects.

Swift

Add the Swift Package Manager dependency ยท guide: swift/README.md

import StringZilla

let i = "the quick brown fox".findFirst(substring: "brown") // Index of "brown"
let h = "hello".hash()                                       // fast 64-bit hash

The Foundation-free package extends String with SIMD search, comparison, hashing, Unicode case-folding, normalization, and word and line segmentation, on Linux and embedded targets as well as Apple platforms.

Go

go get github.com/ashvardanian/stringzilla/golang ยท guide: golang/README.md

import sz "github.com/ashvardanian/stringzilla/golang"

sz.Index("the quick brown fox", "brown") // 10
sz.Hash("hello", 0)                      // fast 64-bit hash

The cgo module exposes byte-level search, counting, checksums, SHA-256, and UTF-8 case-folding to Go.

C#

Build from source ยท guide: csharp/README.md ยท not yet on NuGet

using StringZilla;

Sz.IndexOf("the quick brown fox"u8, "brown"u8); // 10
Sz.Hash("hello"u8);                             // fast 64-bit hash

Zero-copy over ReadOnlySpan<byte> (and Unity's NativeArray<byte>); net8.0, NativeAOT-friendly. Exposes search, hashing, SHA-256, UTF-8 segmentation, case-folding, normalization, sorting, and allocation-free splitting and iteration.

Java

Build from source with mvn ยท guide: java/README.md ยท not yet on Maven Central

import com.stringzilla.StringZilla;

StringZilla.indexOf("the quick brown fox".getBytes(), "brown".getBytes());  // 10
StringZilla.hash("hello".getBytes());                                       // fast 64-bit hash

Pure Foreign Function & Memory API (JDK 22+), no JNI. Zero-copy over byte[] and MemorySegment โ€” including Lucene BytesRef and Spark UTF8String backing memory. Lazy Iterable/Stream splitting and iteration, with zero-allocation cursors as the escape hatch.

Algorithms & Design Decisions

StringZilla aims to optimize some of the slowest string operations. Some popular operations, however, like equality comparisons and relative order checking, almost always complete on some of the very first bytes in either string. In such operations vectorization is almost useless, unless huge and very similar strings are considered. StringZilla implements those operations as well, but won't result in substantial speedups. Where vectorization stops being effective, parallelism takes over, across two layers:

  • StringZilla C library w/out dependencies
  • StringZillas parallel extensions:
    • Parallel C++ algorithms built with ForkUnion
    • Parallel CUDA algorithms for Nvidia GPUs
    • Parallel ROCm algorithms for AMD GPUs ๐Ÿ”œ

Exact Substring Search

Substring search algorithms are generally divided into: comparison-based, automaton-based, and bit-parallel. Different families are effective for different alphabet sizes and needle lengths. The more operations are needed per-character - the more effective SIMD would be. The longer the needle - the more effective the skip-tables are. StringZilla uses different exact substring search algorithms for different needle lengths and backends:

  • When no SIMD is available - SWAR (SIMD Within A Register) algorithms are used on 64-bit words.
  • Boyer-Moore-Horspool (BMH) algorithm with Raita heuristic variation for longer needles.
  • SIMD backends compare characters at multiple strategically chosen offsets within the needle to reduce degeneracy.

On very short needles, especially 1-4 characters long, brute force with SIMD is the fastest solution. On mid-length needles, bit-parallel algorithms are effective, as the character masks fit into 32-bit or 64-bit words. Either way, if the needle is under 64-bytes long, on haystack traversal we will still fetch every CPU cache line. So the only way to improve performance is to reduce the number of comparisons.

For 2-byte needles, see sz_find_2byte_serial_ in include/stringzilla/find/serial.h:

https://github.com/ashvardanian/StringZilla/blob/a6402dd71d01a8967a62bcc45a900477e0232f60/include/stringzilla/find/serial.h#L231-L273

Going beyond that, to long needles, Boyer-Moore (BM) and its variants are often the best choice. It has two tables: the good-suffix shift and the bad-character shift. Common choice is to use the simplified BMH algorithm, which only uses the bad-character shift table, reducing the pre-processing time. We do the same for mid-length needles up to 256 bytes long. That way the stack-allocated shift table remains small.

For mid-length needles (โ‰ค256 bytes), see sz_find_horspool_upto_256bytes_serial_ in include/stringzilla/find/serial.h:

https://github.com/ashvardanian/StringZilla/blob/a6402dd71d01a8967a62bcc45a900477e0232f60/include/stringzilla/find/serial.h#L449-L500

In the C++ Standards Library, the std::string::find function uses the BMH algorithm with Raita's heuristic. Before comparing the entire string, it matches the first, last, and the middle character. Very practical, but can be slow for repetitive characters. Both SWAR and SIMD backends of StringZilla have a cheap pre-processing step, where we locate unique characters. This makes the library a lot more practical when dealing with non-English corpora.

The offset selection heuristic is implemented in sz_locate_needle_anomalies_ in include/stringzilla/find/serial.h:

https://github.com/ashvardanian/StringZilla/blob/a6402dd71d01a8967a62bcc45a900477e0232f60/include/stringzilla/find/serial.h#L35-L96

All those, still, have $O(hn)$ worst case complexity. To guarantee $O(h)$ worst case time complexity, the Apostolico-Giancarlo (AG) algorithm adds an additional skip-table. Preprocessing phase is $O(n + \sigma)$ in time and space. On traversal, performs from $(h/n)$ to $(3h/2)$ comparisons. It however, isn't practical on modern CPUs. The Galil rule is a simpler and more relevant optimization, if many matches must be found.

Other algorithms previously considered and deprecated:

  • Apostolico-Giancarlo algorithm for longer needles. Control-flow is too complex for efficient vectorization.
  • Shift-Or-based Bitap algorithm for short needles. Slower than SWAR.
  • Horspool-style bad-character check in SIMD backends. Effective only for very long needles, and very uneven character distributions between the needle and the haystack. Faster "character-in-set" check needed to generalize.

ยง Reading materials. Exact String Matching Algorithms in Java. SIMD-friendly algorithms for substring searching.

Exact Multiple Substring Search

Few algorithms for multiple substring search are known. Most are based on the Aho-Corasick automaton, which is a generalization of the KMP algorithm. The naive implementation, however:

  • Allocates disjoint memory for each Trie node and Automaton state.
  • Requires a lot of pointer chasing, limiting speculative execution.
  • Has a lot of branches and conditional moves, which are hard to predict.
  • Matches text a character at a time, which is slow on modern CPUs.

There are several ways to improve the original algorithm. One is to use sparse DFA representation, which is more cache-friendly, but would require extra processing to navigate state transitions.

StringZilla does not ship an Aho-Corasick automaton today. For multi-pattern workloads, the rolling-fingerprint machinery described below covers the near-duplicate and candidate-filtering cases, and hyperscan or pyahocorasick remain the better fit for large literal dictionaries.

Levenshtein Edit Distance

Levenshtein distance is the best known edit-distance for strings, that checks, how many insertions, deletions, and substitutions are needed to transform one string to another. It's extensively used in approximate string-matching, spell-checking, and bioinformatics.

The computational cost of the Levenshtein distance is $O(n * m)$, where $n$ and $m$ are the lengths of the string arguments. To compute that, the naive approach requires $O(n * m)$ space to store the "Levenshtein matrix", the bottom-right corner of which will contain the Levenshtein distance. The algorithm producing the matrix has been simultaneously studied/discovered by the Soviet mathematicians Vladimir Levenshtein in 1965, Taras Vintsyuk in 1968, and American computer scientists - Robert Wagner, David Sankoff, Michael J. Fischer in the following years. Several optimizations are known:

  1. Space Optimization: The matrix can be computed in $O(min(n,m))$ space, by only storing the last two rows of the matrix.
  2. Divide and Conquer: Hirschberg's algorithm can be applied to decompose the computation into subtasks.
  3. Automata: Levenshtein automata can be effective, if one of the strings doesn't change, and is a subject to many comparisons.
  4. Shift-Or: Bit-parallel algorithms transpose the matrix into a bit-matrix, and perform bitwise operations on it.

The last approach is quite powerful and performant, and is used by the great RapidFuzz library. It's less known, than the others, derived from the Baeza-Yates-Gonnet algorithm, extended to bounded edit-distance search by Manber and Wu in 1990s, and further extended by Gene Myers in 1999 and Heikki Hyyro between 2002 and 2004.

StringZilla focuses on a different approach, extensively used in Unum's internal combinatorial optimization libraries. It doesn't change the number of trivial operations, but performs them in a different order, removing the data dependency, that occurs when computing the insertion costs. StringZilla evaluates diagonals instead of rows, exploiting the fact that all cells within a diagonal are independent, and can be computed in parallel. We'll store 3 diagonals instead of the 2 rows, and each consecutive diagonal will be computed from the previous two. Substitution costs will come from the sooner diagonal, while insertion and deletion costs will come from the later diagonal.

Row-by-Row Algorithm
Computing row 4:
    โˆ…  A  B  C  D  E
 โˆ…  0  1  2  3  4  5
 P  1  โ–‘  โ–‘  โ–‘  โ–‘  โ–‘
 Q  2  โ–   โ–   โ–   โ–   โ– 
 R  3  โ–   โ–   โ–ก  โ†’  .
 S  4  .  .  .  .  .
 T  5  .  .  .  .  .
Anti-Diagonal Algorithm
Computing diagonal 5:
    โˆ…  A  B  C  D  E
 โˆ…  0  1  2  3  4  5
 P  1  โ–‘  โ–‘  โ–   โ–   โ–ก
 Q  2  โ–‘  โ–   โ–   โ–ก  โ†˜
 R  3  โ–   โ–   โ–ก  โ†˜  .
 S  4  โ–   โ–ก  โ†˜  .  .
 T  5  โ–ก  โ†˜  .  .  .
Legend:
0,1,2,3... = initialization constants ย ย  โ–‘ = cells processed and forgotten ย ย  โ–  = stored cells ย ย  โ–ก = computing in parallel ย ย  โ†’ โ†˜ = movement direction ย ย  . = cells to compute later

This results in much better vectorization for intra-core parallelism and potentially multi-core evaluation of a single request. Moreover, it's easy to generalize to weighted edit-distances, where the cost of a substitution between two characters may not be the same for all pairs, often used in bioinformatics.

ยง Reading materials. Faster Levenshtein Distances with a SIMD-friendly Traversal Order.

Needleman-Wunsch and Smith-Waterman Scores for Bioinformatics

The field of bioinformatics studies various representations of biological structures. The "primary" representations are generally strings over sparse alphabets:

  • DNA sequences, where the alphabet is {A, C, G, T}, ranging from ~100 characters for short reads to 3 billion for the human genome.
  • RNA sequences, where the alphabet is {A, C, G, U}, ranging from ~50 characters for tRNA to thousands for mRNA.
  • Proteins, where the alphabet is made of 22 amino acids, ranging from 2 characters for dipeptide to 35,000 for Titin, the longest protein.

The shorter the representation, the more often researchers may want to use custom substitution matrices. Meaning that the cost of a substitution between two characters may not be the same for all pairs. In the general case the serial algorithm works for arbitrary substitution costs for each of 256ร—256 possible character pairs. That lookup table, however, is too large to fit into CPU registers, so StringZilla ships a 32ร—32 substitution-matrix design, the error_costs_32x32_t type in include/stringzillas/similarities.hpp, which fits into 1 KB with single-byte "error costs" and stays resident across the diagonal sweep. That said, most BLOSUM and PAM substitution matrices only contain 4-bit values, so they can be packed even further.

Memory Copying, Fills, and Moves

A lot has been written about the time computers spend copying memory and how that operation is implemented in LibC. Interestingly, the operation can still be improved, as most Assembly implementations use outdated instructions. Even performance-oriented STL replacements, like Meta's Folly v2024.09.23 focus on AVX2, and don't take advantage of the new masked instructions in AVX-512 or SVE.

In AVX-512, StringZilla uses non-temporal stores to avoid cache pollution, when dealing with very large strings. Moreover, it handles the unaligned head and the tails of the target buffer separately, ensuring that writes in big copies are always aligned to cache-line boundaries. That's true for both AVX2 and AVX-512 backends.

StringZilla also contains "drafts" of smarter, but less efficient algorithms, that minimize the number of unaligned loads, performing shuffles and permutations. That's a topic for future research, as the performance gains are not yet satisfactory.

ยง Reading materials. memset benchmarks by Nadav Rotem. Cache Associativity by Sergey Slotin.

Hashing

StringZilla implements a high-performance 64-bit hash function inspired by the "AquaHash", "aHash", and "GxHash" design and optimized for modern CPU architectures. It passes the rigorous SMHasher test suite, including the --extra flag with no collisions.

The core algorithm operates on a dual state that runs two independent mixers over the same bytes and folds them together at the end:

  • AES State: Initialized with the seed XOR-ed against ฯ€ constants and advanced with one AES encryption round per block, providing the strong avalanche behavior.
  • Sum State: Initialized from a second slice of the ฯ€ constants and advanced as an additive byte sum under a fixed permutation, cheap to compute and complementary to the AES mixing.

Because the AES round is the backbone, the per-ISA backends lean on each platform's cryptographic instructions rather than emulating them: AES-NI and VAES on x86, SHA-NI on Goldmont, NEON-AES, NEON-SHA, and SVE2-AES on Arm, and RVV-crypto on RISC-V, in the include/stringzilla/hash/{neonaes,neonsha,sve2aes,rvvcrypto}.h files. To keep the streaming path off the stack, the incremental construction uses an in-register streaming-state merge: each incoming run is slid into a resident register with a masked load and a blend, so partial blocks never spill to memory.

For strings โ‰ค64 bytes, a minimal state processes data in 16-byte blocks. Longer strings employ a 4ร— wider state (512 bits) that processes 64-byte chunks, maximizing throughput on modern superscalar CPUs. The algorithm can be expressed in pseudocode as:

function sz_hash(text: u8[], length: usize, seed: u64) -> u64:
    pi: u64[16] = [0x243F6A8885A308D3, 0x13198A2E03707344, 0xA4093822299F31D0, 0x082EFA98EC4E6C89, 0x452821E638D01377, 0xBE5466CF34E90C6C, 0xC0AC29B7C97C50DD, 0x3F84D5B5B5470917,
                   0x9216D5D98979FB1B, 0xD1310BA698DFB5AC, 0x2FFD72DBD01ADFB7, 0xB8E1AFED6A267E96, 0xBA7C9045F12C7F99, 0x24A19947B3916CF7, 0x0801F2E2858EFC16, 0x636920D871574E69]
    shuffle: u8[16] = [0x04, 0x0b, 0x09, 0x06, 0x08, 0x0d, 0x0f, 0x05, 0x0e, 0x03, 0x01, 0x0c, 0x00, 0x07, 0x0a, 0x02]   # Permutation order for the sum state

    # Both states are `lanes` ร— 128 bits wide: one lane for short inputs, four for long ones. The AES half seeds
    # from the low 512 bits of ฯ€, the sum half from the high 512 bits, each XOR-ed against the seed.
    lanes: usize = 1 if length โ‰ค 64 else 4
    aes: u128[lanes] = [seed โŠ• pi[2*lane], seed โŠ• pi[2*lane + 1] for lane in 0..lanes-1]
    sum: u128[lanes] = [seed โŠ• pi[2*lane + 8], seed โŠ• pi[2*lane + 9] for lane in 0..lanes-1]

    # One AES round and one shuffle-add per 16-byte block. Short inputs are zero-padded to 1-4 blocks;
    # long inputs stream 64-byte chunks, one block per lane, so the four lanes stay independent.
    for each chunk: u8[16 * lanes] in split_into_chunks(text, length, 16 * lanes):
        for lane in 0..lanes-1:
            aes[lane] = AESENC(aes[lane], chunk[lane])
            sum[lane] = SHUFFLE(sum[lane], shuffle) + chunk[lane]

    if lanes > 1: aes, sum = fold_to_one_lane(aes), fold_to_one_lane(sum)    # Collapse the 512-bit states back to 128

    # Finalization: mix the length into the key, then AES-mix the two states together for SMHasher compliance
    key: u128 = [seed + length, seed]
    mixed: u128 = AESENC(sum, aes)
    return low_u64(AESENC(AESENC(mixed, key), mixed))

This allows us to balance several design trade-offs. First, it allows us to achieve a high port-level parallelism. Looking at AVX-512 capable CPUs and their ZMM instructions, on each cycle, we'll have at least 2 ports busy when dealing with long strings:

  • VAESENC: 5 cycles on port 0 on Intel Ice Lake, 4 cycles on ports 0/1 on AMD Zen4.
  • VPSHUFB_Z: 3 cycles on port 5 on Intel Ice Lake, 2 cycles on ports 1/2 on AMD Zen4.
  • VPADDQ: 1 cycle on ports 0/5 on Intel Ice Lake, 1 cycle on ports 0/1/2/3 on AMD Zen4.

When dealing with smaller strings, we design our approach to avoid large registers and maintain the CPU at the same energy state, thereby avoiding downclocking and expensive power-state transitions.

Unlike some AES-accelerated alternatives, the length of the input is not mixed into the AES block at the start to allow incremental construction, when the final length is not known in advance. Also, unlike some alternatives, with "masked" AVX-512 and "predicated" SVE loads, we avoid expensive block-shuffling procedures on non-divisible-by-16 lengths.

ยง Reading materials. Stress-testing hash functions for avalance behaviour, collision bias, and distribution.

SHA-256 Checksums

In addition to the fast AES-based hash, StringZilla implements hardware-accelerated SHA-256 cryptographic checksums, following the FIPS 180-4 specification. Where the AES hash leans on the AES round instructions, SHA-256 leans on the dedicated SHA extensions: SHA256RNDS2 and SHA256MSG1/SHA256MSG2 on x86 from Goldmont onward, and the SHA256H/SHA256SU0 family on Arm, with SWAR, LASX, RVV, and WebAssembly fallbacks rounding out the set.

The API is a three-call streaming state โ€” sz_sha256_state_init, sz_sha256_state_update, sz_sha256_state_digest โ€” so arbitrarily long inputs can be absorbed in chunks without buffering the whole message. Each backend is also exposed under its own suffix, like sz_sha256_state_update_neonsha, for the same manual-dispatch reasons as the rest of the library.

Digesting one message is a serial dependency chain โ€” 32 dependent SHA256RNDS2 at 4 cycles each โ€” so no wider instruction set can accelerate it, and the SHA-NI path already sits within 15% of that hardware floor. That is also why there is no Ice Lake tier for it: SHA-NI has no VEX or EVEX encoding, so goldmont is the widest single-message kernel there will ever be.

Independent messages are a different story: they compress in parallel lanes, sixteen at a time on AVX-512 and eight on AVX2, which is what sz_sha256_multistate_update exposes. That lane-parallel form nearly triples the hash rate of dedicated SHA-NI silicon on token-sized inputs, and still leads by half again on line-sized ones. Lanes retire independently, so a batch of mixed lengths stays vectorized to each lane's own last block rather than dropping to scalar when one lane runs short. A group still costs as much as its longest member, so feeding inputs in length order is the caller's lever โ€” sz_sequence_argsort produces that ordering, and per-backend numbers are in include/stringzilla/hash/README.md.

AES-256 Encryption

Most cipher libraries are built for a socket: a stream arrives in order, gets authenticated, and is consumed once. Columnar and block-storage formats are not sockets. They seek โ€” a reader wants row group four hundred out of a million-row file and has no interest in the preceding gigabyte, so a cipher that can only start from byte zero forces the whole file through the AES units to answer a question about the middle of it.

StringZilla implements AES-256 in two modes, following FIPS 197 for the cipher and NIST SP 800-38D for authentication, and treats seeking as the first-class case. Counter mode is seekable: sz_aes256_ctr_xor takes an absolute byte_offset, so decryption starts wherever the reader is, at the cost of authentication. Galois/counter mode adds a tag over the ciphertext and any associated data, and gives up seeking to get it. Which trade a format wants is the format's decision, so both are exposed rather than one being wrapped in the other.

The two share a key schedule but not a key struct. sz_aes256_key_t is the bare round-key schedule that counter mode needs, while sz_aes256_gcm_key_t adds the hash subkey powers H^1 through H^8, so bulk encryption never carries a hundred and twenty-eight bytes it will not read. Both one-shot and streaming forms exist, and the streaming state carries two sixteen-byte rhythms across chunk boundaries โ€” one for the keystream block and one for the hash block โ€” so a five-byte chunk followed by an eleven-byte chunk produces the same bytes and the same tag as one sixteen-byte chunk.

Streaming splits by type rather than by a flag: sz_aes256_gcm_encryptor_t seals and sz_aes256_gcm_decryptor_t opens. The Galois hash absorbs ciphertext in both directions, so a shared state that could be pointed the wrong way would make that a runtime question; separate types make it a compile error instead.

Authenticated decryption returns sz_authentication_failed_k on a forged tag and zero-fills its output, so a caller who ignores the status finds nothing usable rather than forged plaintext. The streaming decrypt is called sz_aes256_gcm_decryptor_update_unverified because it structurally emits bytes before anything is authenticated, and the name is the warning.

Backends cover AES-NI and PCLMUL, VAES and VPCLMULQDQ, Arm crypto extensions and SVE2-AES, RISC-V Zvkned with Zvkg, Power vcipher with vpmsumd, and a WebAssembly path that has no cipher instructions at all and emulates the round function through a constant-time tower-field substitution โ€” where the 256-byte lookup table a serial implementation reaches for is itself the side channel.

On realistic record sizes the authenticated path outruns both Ring and OpenSSL, in either direction, and unauthenticated counter mode is faster still. Counter mode's margin is an artifact of coverage rather than of arithmetic: OpenSSL ships hand-written AVX-512 assembly for Galois/counter mode and the cipher-block chaining variants, but not for counter mode, so that comparison is a vectorized kernel against a sixteen-byte one. Key setup runs the other way, since an AES-256 schedule is real work where adopting a stream-cipher key is a copy, so workloads that churn through short-lived keys favour the ChaCha implementations. Per-backend numbers are in include/stringzilla/cipher/README.md.

Random Generation

StringZilla implements a fast Pseudorandom Number Generator inspired by the "AES-CTR-128" algorithm, reusing the same AES primitives as the hash function. Unlike "NIST SP 800-90A" which uses multiple AES rounds, StringZilla uses only one round of AES mixing for performance while maintaining reproducible output across platforms. The generator operates in counter mode with AESENC(nonce + lane_index, nonce โŠ• pi_constants), rotating through the first 512 bits of ฯ€ for each 16-byte block. The only state required to reproduce an output is a 64-bit nonce, which is much cheaper than a Mersenne Twister.

Sorting

For lexicographic sorting of string collections, StringZilla exports pointer-sized nโ€‘grams ("pgrams") into a contiguous buffer to improve locality, then recursively QuickSorts those pgrams with a 3โ€‘way partition and dives into equal pgrams to compare deeper characters. Very small inputs fall back to insertion sort.

  • Average time complexity: O(n log n)
  • Worst-case time complexity: quadratic (due to QuickSort), mitigated in practice by 3โ€‘way partitioning and the nโ€‘gram staging

Unicode 17, UTF-8, and Wide Characters

Most StringZilla operations are byte-level, so they work well with ASCII and UTF-8 content out of the box. In some cases, like edit-distance computation, the result of byte-level evaluation and character-level evaluation may differ.

  • szs_levenshtein_distances_utf8("ฮฑฮฒฮณฮด", "ฮฑฮณฮด") == 1 โ€” one unicode symbol.
  • szs_levenshtein_distances("ฮฑฮฒฮณฮด", "ฮฑฮณฮด") == 2 โ€” one unicode symbol is two bytes long.

Java, JavaScript, Python 2, C#, and Objective-C, however, expose strings as UTF-16 โ€” a variable-length encoding whose code units are two bytes, so anything outside the Basic Multilingual Plane takes two of them. Because those languages index by code unit rather than by codepoint, this leads to all kinds of offset-counting issues when facing four-byte long Unicode characters. StringZilla's own bindings for those languages sidestep the problem entirely by operating on the UTF-8 bytes directly, and internally it uses proper 32-bit "runes" to represent unpacked Unicode codepoints, ensuring correct results in all operations. If you need to transcode between UTF-8, UTF-16, and UTF-32 at the boundary, simdutf is the right tool. Moreover, StringZilla implements the Unicode 17.0 standard, being practically the only library besides ICU and PCRE2 to do so, but with order(s) of magnitude better performance.

Case Folding and Uncased Search

StringZilla provides Unicode-aware uncased substring search that handles the full complexity of Unicode case folding. This includes multi-character expansions:

Character Codepoint UTF-8 Bytes Case-Folds To Result Bytes
รŸ U+00DF C3 9F ss 73 73
๏ฌƒ U+FB03 EF AC 83 ffi 66 66 69
ฤฐ U+0130 C4 B0 i + โ—Œฬ‡ 69 CC 87

The search returns byte offsets and lengths in the original haystack, correctly handling length differences. For example, searching for "STRASSE" (7 bytes) in "StraรŸe" (7 bytes: 53 74 72 61 C3 9F 65) succeeds because both case-fold to "strasse".

Note that Turkish ฤฐ and ASCII I are distinct: ฤฐstanbul case-folds to iฬ‡stanbul (with combining dot), while ISTANBUL case-folds to istanbul (without). They will not match each other โ€” this is correct Unicode behavior for Turkish locale handling.

Under the hood, folding uses register-resident lookup tables for the common single-codepoint folds and dedicated expansion paths for the multi-byte ones. Uncased search folds on the fly, so the haystack is never pre-folded into a second buffer; the matcher tracks the byte-length mismatch whenever a folded form differs in length from its source, returning offsets into the original text. The folding paths live in the utf8_uncased* files.

UTF-8 Decoding and Unicode Segmentation

Codepoint decoding walks the input in register-wide chunks, classifying each lead byte by its continuation-byte count through a register-resident lookup table rather than branching byte by byte. It runs under a fill-and-drain contract: a decode-once step fills a buffer of runes, and a separate drain step emits them, which keeps the hot loop tight and lets callers consume runes at their own pace. Ill-formed input is handled without derailing the stream, re-syncing on the maximal-subpart rule and substituting exactly one U+FFFD before continuing. The decoder lives in include/stringzilla/utf8_runes.h.

UAX-29 word, grapheme, and sentence boundaries, together with UAX-14 line-break opportunities, are found in a single pass. Each codepoint is classified against register-resident property tables and the boundary rules are applied directly, so combining marks, emoji zero-width-joiner sequences, and regional-indicator flags are all handled without a second traversal. The segmenters live in the utf8_wordbreaks*, utf8_graphemes*, utf8_sentences*, and utf8_linebreaks* files.

Unicode Normalization

Normalization implements the UAX-15 NFC, NFD, NFKC, and NFKD forms through canonical and compatibility decomposition, canonical-combining-class reordering, and recomposition. Quick-check flags short-circuit the work, so text that is already in the requested form is passed through without the expensive decomposition and reordering passes. The normalizers live in the utf8_norm* files.

Set Intersection

StringZilla intersects two deduplicated string collections through a power-of-two open-addressing hash table. The hash is seeded for adversarial resistance and the probe sequence runs under a bounded collision budget, so the intersection completes in linear time and space rather than degrading on crafted inputs. The implementation lives in include/stringzilla/intersect.h.

Rolling Fingerprints and MinHash

For near-duplicate detection and multi-pattern search at scale, StringZilla slides multiple Rabin-Karp rolling-hash windows of different widths over each document at once. Each window tracks its running minimum to build MinHash sketches, and the same passes feed Count-Min-Sketch counters, so a single traversal yields both the similarity signatures and the frequency estimates. The implementation lives in the include/stringzillas/fingerprints* files.

GPU Edit Distances

On the GPU, short pairs are scored entirely in registers, one thread per pair, holding the anti-diagonal wavefront of the dynamic-programming matrix in registers instead of shared memory. For short sequences this is several times faster than the classic shared-memory anti-diagonal kernel, which is dominated by shared-memory traffic at small sizes. Hopper DPX instructions accelerate the min-plus recurrence, and a warp-per-pair path covers older GPUs that lack them. The kernels live in include/stringzillas/similarities/hopper.cuh and include/stringzillas/similarities/kepler.cuh.

Dynamic Dispatch

Due to the high-level of fragmentation of SIMD support in different CPUs, StringZilla names its backends after select CPU generations and instruction-set extensions. The full v5 set spans the serial SWAR fallback, x86 (Westmere, Goldmont, Haswell, Skylake, Ice Lake), Arm (NEON, NEON-AES, NEON-SHA, SVE, SVE2, SVE2-AES), RISC-V (RVV, RVV-crypto), LoongArch (LASX), IBM Power (PowerVSX), and WebAssembly (v128 and relaxed v128). You can query supported backends and use them manually. Use it to guarantee constant performance, or to explore how different algorithms scale on your hardware.

sz_find(text, length, pattern, 3);          // Auto-dispatch
sz_find_westmere(text, length, pattern, 3); // Intel Westmere+ SSE4.2
sz_find_haswell(text, length, pattern, 3);  // Intel Haswell+ AVX2
sz_find_skylake(text, length, pattern, 3);  // Intel Skylake+ AVX-512
sz_find_neon(text, length, pattern, 3);     // Arm NEON 128-bit
sz_find_sve(text, length, pattern, 3);      // Arm SVE 128/256/512/1024/2048-bit

StringZilla automatically picks the most advanced backend for the given CPU. Similarly, in Python, you can log the auto-detected capabilities:

python -c "import stringzilla; print(stringzilla.__capabilities__)"         # e.g. ('serial', 'westmere', 'goldmont', 'haswell', 'skylake', 'icelake')
python -c "import stringzilla; print(stringzilla.__capabilities_str__)"     # e.g. "serial, westmere, goldmont, haswell, skylake, icelake"
# Other targets report their own names: Arm "neon, neonaes, neonsha, sve, sve2, sve2aes",
# WebAssembly "v128, v128relaxed", RISC-V "rvv", LoongArch "lasx", IBM Power "powervsx".

You can also explicitly set the backend to use, or scope the backend to a specific function.

import stringzilla as sz
sz.reset_capabilities(('serial',))          # Force SWAR backend
sz.reset_capabilities(('haswell',))         # Force AVX2 backend
sz.reset_capabilities(('neon',))            # Force NEON backend
sz.reset_capabilities(sz.__capabilities__)  # Reset to auto-dispatch

Contributing ๐Ÿ‘พ

Please check out the contributing guide for more details on how to set up the development environment and contribute to this project. If you like this project, you may also enjoy USearch, UCall, UForm, and SimSIMD. ๐Ÿค—

If you like strings and value efficiency, you may also enjoy the following projects:

  • simdutf - transcoding UTF-8, UTF-16, and UTF-32 LE and BE.
  • hyperscan - regular expressions with SIMD acceleration.
  • pyahocorasick - Aho-Corasick algorithm in Python.
  • rapidfuzz - fast string matching in C++ and Python.
  • memchr - fast string search in Rust.

If you are looking for more reading materials on this topic, consider the following:

Citation

If StringZilla helps your research or product, please cite it:

@software{Vardanian_StringZilla,
  author = {Vardanian, Ash},
  title = {{StringZilla: Fast SIMD, SWAR, and GPGPU String Processing}},
  doi = {10.5281/zenodo.21472333},
  url = {https://github.com/ashvardanian/StringZilla},
  license = {Apache-2.0}
}

A machine-readable CITATION.cff is provided at the repository root.

License ๐Ÿ“œ

Feel free to use the project under Apache 2.0 or the Three-clause BSD license at your preference.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stringzillas_cpus-5.1.2.tar.gz (2.0 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

stringzillas_cpus-5.1.2-cp314-cp314t-win_arm64.whl (472.5 kB view details)

Uploaded CPython 3.14tWindows ARM64

stringzillas_cpus-5.1.2-cp314-cp314t-win_amd64.whl (640.5 kB view details)

Uploaded CPython 3.14tWindows x86-64

stringzillas_cpus-5.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl (5.5 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stringzillas_cpus-5.1.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

stringzillas_cpus-5.1.2-cp314-cp314t-macosx_11_0_x86_64.whl (543.3 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ x86-64

stringzillas_cpus-5.1.2-cp314-cp314t-macosx_11_0_arm64.whl (465.2 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

stringzillas_cpus-5.1.2-cp314-cp314-win_arm64.whl (471.5 kB view details)

Uploaded CPython 3.14Windows ARM64

stringzillas_cpus-5.1.2-cp314-cp314-win_amd64.whl (638.7 kB view details)

Uploaded CPython 3.14Windows x86-64

stringzillas_cpus-5.1.2-cp314-cp314-musllinux_1_2_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.2-cp314-cp314-musllinux_1_2_aarch64.whl (5.5 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stringzillas_cpus-5.1.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

stringzillas_cpus-5.1.2-cp314-cp314-macosx_11_0_x86_64.whl (542.6 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

stringzillas_cpus-5.1.2-cp314-cp314-macosx_11_0_arm64.whl (464.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

stringzillas_cpus-5.1.2-cp313-cp313-win_arm64.whl (463.5 kB view details)

Uploaded CPython 3.13Windows ARM64

stringzillas_cpus-5.1.2-cp313-cp313-win_amd64.whl (628.4 kB view details)

Uploaded CPython 3.13Windows x86-64

stringzillas_cpus-5.1.2-cp313-cp313-musllinux_1_2_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.2-cp313-cp313-musllinux_1_2_aarch64.whl (5.5 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stringzillas_cpus-5.1.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

stringzillas_cpus-5.1.2-cp313-cp313-macosx_11_0_x86_64.whl (542.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

stringzillas_cpus-5.1.2-cp313-cp313-macosx_11_0_arm64.whl (464.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

stringzillas_cpus-5.1.2-cp312-cp312-win_arm64.whl (463.5 kB view details)

Uploaded CPython 3.12Windows ARM64

stringzillas_cpus-5.1.2-cp312-cp312-win_amd64.whl (628.4 kB view details)

Uploaded CPython 3.12Windows x86-64

stringzillas_cpus-5.1.2-cp312-cp312-musllinux_1_2_x86_64.whl (7.4 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.2-cp312-cp312-musllinux_1_2_aarch64.whl (5.5 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stringzillas_cpus-5.1.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

stringzillas_cpus-5.1.2-cp312-cp312-macosx_11_0_x86_64.whl (542.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

stringzillas_cpus-5.1.2-cp312-cp312-macosx_11_0_arm64.whl (464.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

stringzillas_cpus-5.1.2-cp311-cp311-win_arm64.whl (463.4 kB view details)

Uploaded CPython 3.11Windows ARM64

stringzillas_cpus-5.1.2-cp311-cp311-win_amd64.whl (628.2 kB view details)

Uploaded CPython 3.11Windows x86-64

stringzillas_cpus-5.1.2-cp311-cp311-musllinux_1_2_x86_64.whl (7.3 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.2-cp311-cp311-musllinux_1_2_aarch64.whl (5.4 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stringzillas_cpus-5.1.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

stringzillas_cpus-5.1.2-cp311-cp311-macosx_11_0_x86_64.whl (542.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

stringzillas_cpus-5.1.2-cp311-cp311-macosx_11_0_arm64.whl (464.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

stringzillas_cpus-5.1.2-cp310-cp310-win_amd64.whl (628.2 kB view details)

Uploaded CPython 3.10Windows x86-64

stringzillas_cpus-5.1.2-cp310-cp310-musllinux_1_2_x86_64.whl (7.3 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.2-cp310-cp310-musllinux_1_2_aarch64.whl (5.4 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

stringzillas_cpus-5.1.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

stringzillas_cpus-5.1.2-cp310-cp310-macosx_11_0_x86_64.whl (542.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

stringzillas_cpus-5.1.2-cp310-cp310-macosx_11_0_arm64.whl (463.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file stringzillas_cpus-5.1.2.tar.gz.

File metadata

  • Download URL: stringzillas_cpus-5.1.2.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for stringzillas_cpus-5.1.2.tar.gz
Algorithm Hash digest
SHA256 fed3cbead3ebb91c88324c2e0f12153efed52b91a32f486a037ce76dee6b5e21
MD5 d86212e070310b8500c67f74d7006b2c
BLAKE2b-256 d389c4343a4d77c4935eb9aed1c9e8abd3492dd24fb17cf256625479974f2931

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-win_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 3adc193c5abb5481129edfcd1875a2d752144de99bc95183b32e3c1842997917
MD5 9f6b406e87fd55b9ea8beba3e495ae5a
BLAKE2b-256 dda5faaa86316addc429c405f36f753211c53e8419f5c0386688c2f1fa139978

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 52ebbf55195080e66f585c31065c47849a6a72a826c398dde73d7764962bfad2
MD5 4ffe8716042fe5ab67b0269bab166e98
BLAKE2b-256 5973caf79cf9fef1110c983a03e750a35a30593ff946791c6278801238da3a85

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4ea97de506cf570b6e14d80da0785aebbbd142c3160832363062bba919c272a0
MD5 f3de871f8021d3d1ce7585b7277a44fb
BLAKE2b-256 bc833a3977095a3e091a3e23c5cb065b1a2690355473392d68d8760114849ca4

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e7fcdb79bff85624285ff34a0fca4bde6a5eec89d166fb629277477b8a380b11
MD5 c295d4753436a9ef45582c30ef594db9
BLAKE2b-256 ddadd7d966f279909d0bfa98a5444939f09c2cb4056a01a1b83c6007af0fbdc9

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 64c31a4725a76d898f3ef19df6c4e0897522da8700ab36cf95adf4ee738d3be9
MD5 1d15cce0990410669021386ad84f25cf
BLAKE2b-256 6d3fdd72fe52c5ff2ffdd18ef5cb4c1736b0aad2f64c17664e0e0bf31f361d61

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0003940db8a31d8908d8145ee53611f94122e5381a9b824ca75a7e5fc65d8d47
MD5 01f936f5eb9a01796e3c787ada6980b8
BLAKE2b-256 d29b009a48cb37496fd511b49f578055966fb4a68ddb8deb41407c95b028146e

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 e277da2af1d9490d708562a7a6d0c753ce0ee0aa6fa1f8cb4ef8dbe142587c14
MD5 f438d67df4e16167ddad5062180e4cc4
BLAKE2b-256 efb1834801d0e788eefb31632b33c58f2a64bba95936a9ec252a21baba70539f

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 17d6d5ea7088f1ffb6f72b2b3ad403bc2dd0e8035f421d9a1dbcc5368f84a70d
MD5 5000b69901b2738e1001154acee4500f
BLAKE2b-256 776f76205907c28c630154e207c3b57df7e84cef854d5dc85bd38f7653c96b94

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-win_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 d9a364aecac38dc6a007afe4a299d5821e8ea7b0fa1510f001455534923ae41c
MD5 1fe62d19bab228cea8813c0aca27386e
BLAKE2b-256 256db8a54b79b2acacb451788f71773a1710afd204232950b9ac1604b556a928

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3c91a5f9f161f3c468c40db06c399237d7fb130111fe068b7d39e1ce4d4054c4
MD5 4a6da18b3f199d6d38b307109c899213
BLAKE2b-256 1ed73c7c3c4e7c19fe2054837e3bc0bd67d359c83bd39a8d7e750fd78cea1227

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 64ed9da123bcb1fccd56071731c2ed695c248d4e3c255a1459234cd7c553cfda
MD5 0de87870b2a05f4589be827a0ac6d8c1
BLAKE2b-256 7238014003a629bd28ba9d220d116929fdb4b063bf2c2cc1585938122f33f1f1

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6c5b7a5ca0613c89919d1db0d6caed78921a51569d43ce9ee2ae51a02f4273e3
MD5 1164fa9f5a4786316191e5d62880454d
BLAKE2b-256 0e19471d8b5fa1b203a70f05f8b110c933fc496f30a8ac8c29798e6025631338

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 133b1ba8b85e74171bc26cf780811e14e666be35257a5af1e24c4948850e427d
MD5 92c1fe03cf6b8121f95f77506126f51f
BLAKE2b-256 2d3edbf0938d9e94c58af0db6a4d8d6efe05fd56c2e4d860d42bc949ac6f8ec7

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f4c94f7be934f5dd51e333ac6b3d273510f044d60d2f866f36ea999e282c732a
MD5 a4fd7df9a7eaf4c6bdfee0e4dc0b0e0e
BLAKE2b-256 fee3ec68f7274ae3a1bb9e4c9ad8b504e83903e59d74cc4093fb7235a57bbd25

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 dd4370f3afa997f90cf44813ebc8f02cc1d37c1e1a258d8346413884001ca0a5
MD5 5a839bbc1dd5a8014e7eff03bcca0848
BLAKE2b-256 ad648e2f10242c7e582d895644e3d9ff865482da896980c548469550a8400a23

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0a244ff798e8a1fcc1014f77e489d3d66fee187c05a813d2d989f60d2eb283e
MD5 c07ed5ab140d901e4776ddc45535b711
BLAKE2b-256 7c6d67b687e52590bff19bbbe3b446f84ec8d86362d794e9ad15d43db192205f

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-win_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 c97672c73a1e10cee111885609380fe08c493fa61697d7a6b32d6d1abef301cf
MD5 b09de1279535a53348b70159e78106c5
BLAKE2b-256 3504a905ceff8add377b09ef85351349adecfcf713ee0b9ae04b48fb41b5815d

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 111e42fee156507d405b6ee28b8dd5e241e8624221bf759bda10b416c7fb4a30
MD5 6e4f1acfabccf3d8eb05241523aba9b0
BLAKE2b-256 68ee6ff995ba247eb749f3cd483655582cf73d1ee26fcc4eda8aace30e5d7ee7

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 da59d440e7b7bbb363343f449a5a91e9f309de6ad9d1e0df8c679f4f40871487
MD5 b1db3d84c5b297cb5d30018a44d4f699
BLAKE2b-256 8113062177faa9f1a91f775679e6cc527d25bfdd3ddb02ac58db73d2cc076a8f

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 79b9ba4ce99059fc014cea6f63ba0915c13d8723be9adab51a17d5fc605acf0b
MD5 020e829e496acdf4fae7f9aa1886ad16
BLAKE2b-256 330247c16d82d039090ba5e9993093bec9b36a5ed8e7611e2d70a4ca0df781d5

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5191e4f1e4ef33e26db53f17b58f76848451952cfa46c29ab6e4d23394f49fde
MD5 fc30881841a1139f4146987c5ad2f9ac
BLAKE2b-256 0b9b50f544b9bb179a4406e083f27cac04462f52af11ad769184e5078a3742bb

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a6ca3723a5d40396372dd6aefa80d631189b828adf0abfdcbce202ba785484ce
MD5 5b09f8e71c1efd0c1566e7e31078375d
BLAKE2b-256 42d1774c0bec677a1296cb89133fd378c5e214a2c23c5886ea51b87483e26353

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 db853a19fac1dd6e8f550a57575fa124e8e050c19b3361ea4fb90595fa5025da
MD5 8e14ccfda09af7602572610a5800de9d
BLAKE2b-256 b49eb1b4f9e87b9c8b8d2e5158d2ca9ef814b31a26e896267896ac918ee71837

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 00a2c6d8fd5a57e2caf92438c3d7ecc5e528da0375a98a54fce463652264523f
MD5 97650b88035b9a31d0b94c115a9df0b9
BLAKE2b-256 d3d554c6c5ef4f203669e0b20f2b57216106a993a60f8000c80dfb01c40fe91f

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-win_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 9376b8105ce5e8460c9262ac6e0046c185eb3b7699e443df717475241ba8c303
MD5 26de00d84503f22827eaf989bb1162dc
BLAKE2b-256 7753b164cac9e664f6d08f0b7f11977a32369bb0834f08aec4b34b9f87f4ced1

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3ceb4140c02ce3f7f7d51b5cffbe52131e4555404ccb31633ef28afd5fc9d56c
MD5 1524c17553092d9d28d440d517cc81c7
BLAKE2b-256 5ba7f8004f0cd95a5baf41f624ae559231a186401d6d026ea38464ef11860c02

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9350228cf106bbc726b040f0020e7beb058397aab0897cba2ebba71696221a05
MD5 8389f747c4b8ae1449afc031bc825e78
BLAKE2b-256 909171e144f753aae4b5ee40b04d5f9c0f7ef5d9d75598a3cffcbe7d0a5cc103

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1f354f31150e6eab43086449bdb90a3b61f6d72afc78fd9c2e7c75e925ece0b3
MD5 e225e37b3bd0d50cae0b09c4f8d80f30
BLAKE2b-256 54a11f37f910c9e29f6e0338dd88e67f737f7ee9a36deb283211b5c1a57b0321

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2f01b3fb9e3db5279427cf3d78e1ab79ca2b61a5c0341935b28920f5c655ed74
MD5 1c770ec28250491839fd5dbeddcef58b
BLAKE2b-256 036d013260184601cfa79ac52e3346e8524bf91366886ccada41208dd6caad86

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0463c4d16868cbc4993a01cfb12f2e88321f40d7c173e81a7345e5393d1975d8
MD5 ca7fd35698379c36acbcffa4259658b7
BLAKE2b-256 732e742aefe28931cffa075af9db01830d822d9d767d30a0cd06b7d9ea7279c4

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 5aefdde7042ffbca564b7f6c12269e775b0c85aa3ea847f5adf0670005380dd5
MD5 ed5c4fc00efe727bca0a9d6b494d4231
BLAKE2b-256 96de3c314cdbe5b7e47beb659e87a675019b8ea0df463def3881eb67a86937ef

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 14791a7fe3066fb78cb702515861877d14140434fca00552e88ef29e69fa69e9
MD5 b5132a421c91ec3bcf3148505d82c5f6
BLAKE2b-256 bec0b78fed959f1ad9b88a006089f1059448ede38fbefdd5cc62111f19abcbb3

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-win_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 ca22deb78fb639f3b0534511572345d2231389a2622d6b6a20ee76ac350a3be5
MD5 af526a9091cdb433b0a893334175f9a0
BLAKE2b-256 a9c182bf63615ee57de8df7dcb938a7dbac58f235770460ef10165a9a45c8a9e

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 66db0743356c7376d4d3594d941c21825c70a76f1b5bc5480cc8632c95ca82d5
MD5 ff19b16adcf126c1d2ff79babf8e7fcf
BLAKE2b-256 d33f43797e9b128a9f7cc46ea1fcc29485126269c840846b03715a61f5dc2da2

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e40dd8f37a8825244c567a71b5b842550175ffb56e489f4089ff05b0f4068ffa
MD5 97df6e0ffe9f4bebf93ad6a9d83da24b
BLAKE2b-256 2280538e5bf82b7a9756ee821c68afd346a91d739b2015f30bd81fb494fec515

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 408fce7e6585534be22c4dd8ffc9d4a0f89e5a10dfed30f9d6025973fd070ee1
MD5 91c08c730a0af6a64eb70a5036a33741
BLAKE2b-256 34e2dc6cb727078a2bfd05e1246e872e2acddc66a7edc31400b2748c17e7d5fe

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 71515c72715a347f4d47ddbf1f7292d6fe6cb4883435cd3a6e245ee94b1f5f3b
MD5 8b8e4df96aae93b8749deeeac0bdb723
BLAKE2b-256 b1ee489ce3d2c512fd374d3acedc868abf10ed15642fd4882cca5791d6df1caa

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 46163cf95d0aef07fbe3f836cc970063f488966bcab42e5cec071623239f350c
MD5 33e8dde5a5d7bfb1fa95da2ca184a2db
BLAKE2b-256 14551ad008dac599829b30947f4b82f7e41eb21a8174afbb65583d6b5e85b9d1

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 3121518707a3c020b4d0f22fdd0cd4be876c95c7011718d772edf2899474997c
MD5 051c8ffbfb94c04815a3f27b003ef943
BLAKE2b-256 224fd5b6608eed42b70d12ba161be555f3d53be59abaf2967f5083890678e034

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 948b42d6d53f169e648dd11ce683cbceb76d7514fc50a9d6974de8d093c40527
MD5 2a3ad3ac079cf93fb6803b28b4d75bba
BLAKE2b-256 ef931c8fad63111c556e8851386c862797ffb39ebf02d60554d0310bd98e8edb

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fd8ed0ab8273aba0748dbe29c695b8155034549fbd9d042bc72a28975575c24f
MD5 ce00ee59ae69710265b50cf931c914b5
BLAKE2b-256 8bfe5a7de7fcb20903807eef2bb58d12cdf3b00202043ba2bf0fab64f282fa45

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 38033be1e2406c985954aea155c797e84b3d6b73001f4c7c0662b03ccaec3d3e
MD5 500835382c961c640d052b5edbfeba3d
BLAKE2b-256 5e93a7b436fce1a10ceda54b4fc363feff26454830008273709288137f5534e0

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b39c66285ebdd83e7252ef122280c37c2a0e1517aea8227fcf366c2ad9cc817c
MD5 1c0438105e83b1983c09ad08e209591b
BLAKE2b-256 7d2c3ea60157dc9bb97354b00508d3c2f34a4968aad74f57d7fe71ba3f5b24c7

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d8915a25c406f5ff13c16cc47a07429a85289312c023dea33c71a6174786a3b5
MD5 6dc4b303c9af0bf2a32374346c8d231f
BLAKE2b-256 dbda84947b7b4be4850ec2feeb77b0265904afea472df0cdb5a55aeb363a1cba

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5e89a25d822e053e3e6608f77724ee5dcd432eca9b95ae362e492bcefece33c5
MD5 ba534058214be33188421a261a61aaca
BLAKE2b-256 50fc878cc8ee74e0268287e6b33b19510d2622dec7b36991026eee69a68ac6bf

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 602c6a939e05cee14536357de596859efadfa2915afe24b1dfa002dd6b409e64
MD5 7a64acfbb194b0df2da58ef4b7f111ce
BLAKE2b-256 af41b60f83cbd47613e6ef3550650fe4c7e24ae4308fda2b504a7c129657b95a

See more details on using hashes here.

File details

Details for the file stringzillas_cpus-5.1.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ea66903156bdf81bd7fac833036159183a648a2bb86e3d24eb40d0fb59fa26cc
MD5 0bb152f982561384d04e2dc871107315
BLAKE2b-256 2f523e1b70b20ec0ee407940c71ba1e08b2e88478fc2491ddbf274dcb4d16ee6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page