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. 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 roughly doubles single-message SHA-NI throughput, and on an AVX-512 CPU without SHA-NI it is about ten times the scalar path.

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.

Against OpenSSL the authenticated path is a fair fight, traded back and forth by message size. Counter mode is not close, and that 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 the comparison is a vectorized kernel against a sixteen-byte one. The honest summary is that we win where the competition has not bothered to vectorize, and draw where it has. 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.1.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.1-cp314-cp314t-win_arm64.whl (432.3 kB view details)

Uploaded CPython 3.14tWindows ARM64

stringzillas_cpus-5.1.1-cp314-cp314t-win_amd64.whl (590.6 kB view details)

Uploaded CPython 3.14tWindows x86-64

stringzillas_cpus-5.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl (7.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl (5.3 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.4 MB view details)

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

stringzillas_cpus-5.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

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

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

Uploaded CPython 3.14tmacOS 11.0+ x86-64

stringzillas_cpus-5.1.1-cp314-cp314t-macosx_11_0_arm64.whl (464.8 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

stringzillas_cpus-5.1.1-cp314-cp314-win_arm64.whl (431.5 kB view details)

Uploaded CPython 3.14Windows ARM64

stringzillas_cpus-5.1.1-cp314-cp314-win_amd64.whl (588.8 kB view details)

Uploaded CPython 3.14Windows x86-64

stringzillas_cpus-5.1.1-cp314-cp314-musllinux_1_2_x86_64.whl (7.1 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.1-cp314-cp314-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.4 MB view details)

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

stringzillas_cpus-5.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

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

stringzillas_cpus-5.1.1-cp314-cp314-macosx_11_0_x86_64.whl (541.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

stringzillas_cpus-5.1.1-cp314-cp314-macosx_11_0_arm64.whl (463.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

stringzillas_cpus-5.1.1-cp313-cp313-win_arm64.whl (424.0 kB view details)

Uploaded CPython 3.13Windows ARM64

stringzillas_cpus-5.1.1-cp313-cp313-win_amd64.whl (578.5 kB view details)

Uploaded CPython 3.13Windows x86-64

stringzillas_cpus-5.1.1-cp313-cp313-musllinux_1_2_x86_64.whl (7.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.1-cp313-cp313-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.4 MB view details)

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

stringzillas_cpus-5.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

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

stringzillas_cpus-5.1.1-cp313-cp313-macosx_11_0_x86_64.whl (541.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

stringzillas_cpus-5.1.1-cp313-cp313-macosx_11_0_arm64.whl (463.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

stringzillas_cpus-5.1.1-cp312-cp312-win_arm64.whl (424.0 kB view details)

Uploaded CPython 3.12Windows ARM64

stringzillas_cpus-5.1.1-cp312-cp312-win_amd64.whl (578.5 kB view details)

Uploaded CPython 3.12Windows x86-64

stringzillas_cpus-5.1.1-cp312-cp312-musllinux_1_2_x86_64.whl (7.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.1-cp312-cp312-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.4 MB view details)

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

stringzillas_cpus-5.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.5 MB view details)

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

stringzillas_cpus-5.1.1-cp312-cp312-macosx_11_0_x86_64.whl (541.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

stringzillas_cpus-5.1.1-cp312-cp312-macosx_11_0_arm64.whl (463.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

stringzillas_cpus-5.1.1-cp311-cp311-win_arm64.whl (423.9 kB view details)

Uploaded CPython 3.11Windows ARM64

stringzillas_cpus-5.1.1-cp311-cp311-win_amd64.whl (578.3 kB view details)

Uploaded CPython 3.11Windows x86-64

stringzillas_cpus-5.1.1-cp311-cp311-musllinux_1_2_x86_64.whl (7.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.1-cp311-cp311-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.4 MB view details)

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

stringzillas_cpus-5.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.4 MB view details)

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

stringzillas_cpus-5.1.1-cp311-cp311-macosx_11_0_x86_64.whl (541.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

stringzillas_cpus-5.1.1-cp311-cp311-macosx_11_0_arm64.whl (463.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

stringzillas_cpus-5.1.1-cp310-cp310-win_amd64.whl (578.3 kB view details)

Uploaded CPython 3.10Windows x86-64

stringzillas_cpus-5.1.1-cp310-cp310-musllinux_1_2_x86_64.whl (7.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

stringzillas_cpus-5.1.1-cp310-cp310-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (6.4 MB view details)

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

stringzillas_cpus-5.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (4.4 MB view details)

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

stringzillas_cpus-5.1.1-cp310-cp310-macosx_11_0_x86_64.whl (541.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

stringzillas_cpus-5.1.1-cp310-cp310-macosx_11_0_arm64.whl (463.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: stringzillas_cpus-5.1.1.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.1.tar.gz
Algorithm Hash digest
SHA256 8b2cc7eb4e765ebeaa2847715df82e1b534a01cb0ef20f552ab9be70fd35f9bd
MD5 62e8422c4ea7816ebba0e3e711e2707c
BLAKE2b-256 e4101debb4faa73d4b496972793d88068f16fdbe79c59c18cce0032a6728101c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 162242af636d35db899be515fa6a5de5e3a70605f680ef8f840573f2ee130089
MD5 9002a59bb68c84a50b9cb2c6357987a8
BLAKE2b-256 41f4d29b6c55d9ffbdfd4c2c80d08072e4fc14bac1af47c43a725a778eb78b77

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 dccf90ea9362c02e09ca6a3c3aa4fc0b0eb5662ef42670247e34773cf26fa22f
MD5 a4ba60fa3e16a45febbd1417689c0b5d
BLAKE2b-256 93139dfd490074439a9e6c62e5bab40e2fbfe4cfce0fa2e256119e720890adb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bca3523d45599830181acc66f2c43efb8329e453ebf9b030dfaa044978c32623
MD5 649abf7c4dc35afd5447a81b76cf3a99
BLAKE2b-256 894c33910f7388af772d5ac6c2b137394c7ea1e6fa907302a50d4eeb7d54e11b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 51d5ae906afeb39f49c609fef214bc6dfcba2be66466e8b408767e0349ec6e17
MD5 6bb1ee935160043a1d391ae571a61556
BLAKE2b-256 f2760290b3121ce0150366af1c9c5f677379402e9e7ab00663e52ec6387a0348

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b690755522196b961fc648b273d8b481a4e60c8ad59256d309894e8549f0971a
MD5 bf7156e2d0b2dfca64ebcc2fc44c0cae
BLAKE2b-256 73bd7c62bbe1653da3b56464d9483d127dc2d48bd7e27564f3adfafbfabc0ad2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 77755e969f2a66f4fa23f13db6337c02fce312a7015c3fb61559f2d954afa917
MD5 87d9bc126dcb717df9b5566b67c667b2
BLAKE2b-256 f379e359e801ead5bdcd39359cf9f8f1e1a49ceb524b2538e9eee6c5a18af40f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6a213dc5172b12bdd4035bd152c7aeff52988afb3088a15c685bda2d40ad518c
MD5 ce910080cd4c1e88080da0328ede5c36
BLAKE2b-256 e32fedb18efb99e76b575ccefee6c176f952dabee2738b21969d3dc4fa904809

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34281b5dc34fdb802d7820ddbc6fc18fabdca80bf902b337dd0ba4e7e7f6345b
MD5 ac3095a83fcbcfdbf13b4e15d2b516a9
BLAKE2b-256 a196ecda0cadc4c42866d81867e54def787e1399d8ebe23d87b07aaaa571d73d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 78c79bd0c86db13c07ff507e65d2c33ff0164935f8f2e081a2049221cbb8e724
MD5 cd933fdd2a7980172e3a9fd0eb74dc02
BLAKE2b-256 4db333061de1010322905d0b58aae24f1a28511cf73a14133476470edb4d43f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2d858356358115337aea3cd4eccdc1789a712de3af956c162d7ec6bf800cec94
MD5 59dda3c61702187d39ad96f297a65f00
BLAKE2b-256 4e8a102bd913814665361809b45eb746e8a348138d7225eeb0dea91541a32688

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c0b77cbc0e578c5f405c1d84119e69430373e4ecf1a622dca05f02a54e106a25
MD5 1d0d871514c5eeb934d630cb408fcdfd
BLAKE2b-256 55bf3df2b37fb8226dd350fe4fd258162ee0360e5f4a3cf1418436fa5f7dcdee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c58b66e14b9c89b63e0b5c0e9361365d2d0ad6ba7e1271d372830080a015c34e
MD5 685cd05e63028a50de6b830cd32f2b4e
BLAKE2b-256 aaec8c1932be0d64aaab53299b4eaed343b4067fed36fffa912e3bbe1058e37c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 feb830f979c8a2638f2aca7ff0110a242da79a882e18eb59df19c880a68e9153
MD5 818165007807aa107ab5665582416502
BLAKE2b-256 11487a144c79b1db65eee938b221719f1a59ee5753b17ce9ce23a79a1255b062

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 53f27955a9e0c82f19254812164db70a5180f51edd0dc592af919de1abeb870e
MD5 9228dd47d299a125c7672b9b07903be9
BLAKE2b-256 039b5badf89e17e5250bc6bac90ef75010255484ecb419a316e467206281c5ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 a6c33dd52ee2093c3333b29820e05ff6f3ede0be589e8c868d2f111e66ac409b
MD5 654be62238a66b9df724e62efca63996
BLAKE2b-256 ac20084980d789bdea8cdcd829a22b226e706d3280b8fea137032d1ac23b05e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0bc31e3790f17450dc9730140e77becf57d8dc8cd4a6f08e89aeb03b46281c40
MD5 4c9f44d00c0ccb3ed92282dfd70d7e79
BLAKE2b-256 211793c11712b72b8b8e735089d10c8d5ca96cc630add4676158647fd64eb6df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 846c2e99ac40e497508a7b15c53bbf4d7e2dcf390bb66e678ea4e8cf5db2cd92
MD5 1b37ff9abd111eb9b27ce9428c90f8c1
BLAKE2b-256 11f93125153c53632d7f390ef0f138c1015c80b72869898c2e695637bdb46955

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4bc041ada36476ec509c9f561d39973d2e2481a64a0f81d68f579ec3cd9ef73e
MD5 3cdb2312ae2322ea6f202b49e98b9293
BLAKE2b-256 6a12aa75a2e04de360fecdf3082786ae0f418c5c9e0d69cfc3cb7e311b735285

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 481e7e15b9dad1ebbd8a72247ddb6de132a824ceeccc6f28f6919c77c00ccc27
MD5 ab11654507a972d94f0969105d6c1b24
BLAKE2b-256 2938fb7e51a35b1b84d4d171f10ade6c668bd61c36697fd8e84741026418f5c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7e1ee6587d753990ddc8e0e2af9b891a66fb3def390cc791a8e882c59b2262be
MD5 a8441dfa24d082d9a9b90d175ab48108
BLAKE2b-256 9af24910e0ab4eafdf5d5edef49b04d077de0c8ee5391476be79e067b9e741dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bb5024890ce4b9fb038d6e2aa6996b566d232743676cf09b93522bd1ab043b3b
MD5 5a95cc570b367dca40792e94c394feee
BLAKE2b-256 b6ea41590fd71593027b2eaf2dba2306b439f8d71cf9e5ee29f5551a67b77542

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a3ccaf211aed8d90914bba28a2aad65cc5b44ee99f86882ec92095d87956c17c
MD5 43ff9e34ee3790204eddd49747c56a2a
BLAKE2b-256 c9c3af7485cc415ea666aeb05b98f567f617fabdc5f716893f37b53b11ca6a94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 dfec85a1327a680e42f24836b9e8249341e6fdf9294711a7590713f53a436d28
MD5 e01cd8e4b2e50d2bcca449df8aac995e
BLAKE2b-256 e0a5ac2841770011030e1411525364484fe044e4eddbdc19afc8b03b15daadcd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d7a2df9e191aab32078216dff5c840275b56655922fbaa414f186d64b0f69012
MD5 270129057371cf975f3787c3e4aa1b59
BLAKE2b-256 6cb8b4e950bd51b32a24de5ba1f31ec875eb8b68924423b48be9098f32ece2ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 180e769d9bca5ce8afb83ad74bfa3af4a6a767a78359c3173248f8c5eff8eed8
MD5 f08b5a4979500b3bc383369213cfcb2f
BLAKE2b-256 4905be10dd69b890d1b4437ed639cedbed0921fc1b79f15b38adfa18033126c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 22c41cdd81c2373fdb51ec5890b5adf1c8a71031c9ac7cd33c5fb1ada51bc0fe
MD5 6d555877a87a8796f4d3ed8e2ebc1414
BLAKE2b-256 51e3deb884a6f18e6c54be1f97a545b7c073ca4bf27aea1fae4b2c99c22f2465

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0936008b5feffd806762a7a1fd11ab13a932929837b9c3e8d9f1c96a7c064af7
MD5 0e868ef759d0e3355cb57cbc68131708
BLAKE2b-256 8f41788e9a142c1bafb037182cf774a0940efc7e8732c663cac6ff417733c4d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 acd3fcc704dd4148912e0e3de8886e5a4f6af226da828a25b6a7b3e72eb32d2c
MD5 a921b81030bd8b7eff10573b24fade20
BLAKE2b-256 9deb159849507c34f2acbeadb24328b8247b3acc04d1761c75af7ea1298ed1e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 88f3a9828254f66a6c0f9f29b97db0f7ed3ec7a3a3e4f89d482ba58608b9e0cc
MD5 5a8f796b31743e60926c9cc83f25cb49
BLAKE2b-256 c051d5f00d924663d8f2bddda7c2c0c88477c19f12ce345d17a5d3a230456ba0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1bd91df5c5df950e1c65fbf19af86a265266917c8f86b3ff9c5105ff08701ce6
MD5 131af53a5ef1eb76bf52cb8f737f7789
BLAKE2b-256 b6c7e21fbad982cd9473c917a730477a3c5eedf5465da2f0aaeb1bc9de455164

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 adc40695b022137d86cf2e57dfc9ebca9bccd0dbbb3862f59495f5ff96225608
MD5 bdb7ae7c5b87888f1f1c19db91e67c83
BLAKE2b-256 0875880dd6480f61498ca5be1572e970b6716b8b86b54c4ec589fb3f44348d31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 62fdc368d38a600df2f3830109379ae66aa1aaaf9cd889b450aa6929d90eba61
MD5 ae48e2245fae091aad0a687678c5ae70
BLAKE2b-256 550874c9522004435505bbadd21fce68482fb4f30fa039de20b92419e684531e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 76ad19cf3521ea276a877f7009245964201eb863c7e6bce110866399888651f6
MD5 f9cf5cc37b2488b5ff1014ad8a2ac77e
BLAKE2b-256 bd023579b4d1b9433c6250237d77c54658be0380101fb254198e264145aff6dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9a756c40fe4dd2a1db2e482d55f3c2b1afcfbe0d6a1ff2d9248402a97bd14f5d
MD5 e7fd393c76f305f80b8752d4633d5819
BLAKE2b-256 07b7588a425fee5433d0683d82abd20021fd2195cf448423d95b364b7fca26d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7a4c95b1c83698e2eb654a802d66386bd7a31c55e2e68eaabb52509c3cf6bca3
MD5 f3797b81cc6df17eb3dab94b85f33800
BLAKE2b-256 aa9cd6fc9c771be53ce11f3e2a944c489731d6a37062146fb8ccf4a36c1fffad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 972dde5a119f54904585245ba5317459a51200ef2454a179297cd126a26f92f2
MD5 2916c98a2f33154ed06c33140a42fb57
BLAKE2b-256 95261ded7461e8afecee29b1800635f720a0f00ce9b0eaa4d083ac0379f216cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bb8b637c10b71e232e82093bd08e13e94a7a73ef659f3cb10543aa4d70991388
MD5 b6815420342e265cd0672d874499aac8
BLAKE2b-256 8b87d4b4fab8508932882a49d191cb70f91745662ca87e425055d7c6a1d6a1c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6e9ae09fa645cb1a054df76b28db92672534721abed162020095506d852b0b82
MD5 37fc662e445be26e79ab54f73ec7998e
BLAKE2b-256 535d95a054427f0b94b7386d0caff1f74f431dcb00bde42189f18005bb6ea4c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 0bfcfe077f0fd1dea95c6f4f05792aa906ab617e070aa0cc37af331357522b99
MD5 247ed97eb6c4daa07cee549a37118239
BLAKE2b-256 35cf16a0d7fbc836d0e6ccaa33f7bc9638cfff539859d1e3196eda295d356011

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ff79ff699badf17868687cd35db1102ad483db0f41a260626af950a821245d53
MD5 a6bffb8e7ad473120c85f43efaa77aa4
BLAKE2b-256 c88fea5dcb0e9717da8ca6bef9a07a273c988e20ca1a48f6274a215076269889

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c42218570a6f23d3e9b21b87421ca1673037c2739a242ecce94b436c98f9ba2a
MD5 27c75d618bf86389a3333b25659a35d6
BLAKE2b-256 d0d3605ff2b9ac27b0d291f0afc23fcacede1b91d80df40af5d781d1096866cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0d5c12731b118c4af3505d41d12f46fe3f721f7d2a10dccbf337aece511e646b
MD5 6ef43feb9dffb9c6606f99dc6606ff41
BLAKE2b-256 27600808f72bc249cc5f42f917cd25f0255d2bf4e4c7d4fbd6dc1bcebe46f96c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6e78e38d2f784625c22eb9ff40c6eb929e710f55b4b7d676d0e6d84cf3f4e8eb
MD5 700b341089f76183a249da16ad277450
BLAKE2b-256 15a5d252ce9274f5a2f9d87fc70945dc4e4c2cf4068482e2ae41d7e89f68fbf8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 879405110470ead9a0a9331a23352682e516f043311597e116bcec1a7f856134
MD5 697715be875b507609ea50c0ebc351c4
BLAKE2b-256 e27fbe6df5480fdc00e35269876c96c32ef4bbed90cca0605856c895921320c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 78020876e5bf7f88119329154a4cecf2555e3ce386fdcc20fd92bcb3820467df
MD5 65381e834f3f7c5b86c613c5320a6167
BLAKE2b-256 814e0da405b57a270d772ee49f97a63010c8128fec1a7c432cec586e688e63a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 1b0e9e4dd8b34be22b589b183e3cb34f274594ac8dc5e8fcfff5f785e9c27b5d
MD5 434445b6bbd825afecc13a6449116ba7
BLAKE2b-256 52abc90fc496767ec6f2cc0649a4825a7d00eb9b95bb00fa5c12629b41aa132f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.1.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 19816eb5772260f8294813e8db75078be12445fdbba4a07b911991516141c1ef
MD5 65c6d1862b62169ae99f91a20a62dad4
BLAKE2b-256 f725905383d2132c3c2de35f80082249772369d1bc37474034ad743e322f0bf8

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