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.

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.0.7.tar.gz (1.9 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.0.7-cp314-cp314-win_arm64.whl (419.0 kB view details)

Uploaded CPython 3.14Windows ARM64

stringzillas_cpus-5.0.7-cp314-cp314-win_amd64.whl (576.2 kB view details)

Uploaded CPython 3.14Windows x86-64

stringzillas_cpus-5.0.7-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.0.7-cp314-cp314-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.0.7-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.0.7-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.0.7-cp314-cp314-macosx_11_0_x86_64.whl (530.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

stringzillas_cpus-5.0.7-cp314-cp314-macosx_11_0_arm64.whl (451.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

stringzillas_cpus-5.0.7-cp313-cp313-win_arm64.whl (411.4 kB view details)

Uploaded CPython 3.13Windows ARM64

stringzillas_cpus-5.0.7-cp313-cp313-win_amd64.whl (565.8 kB view details)

Uploaded CPython 3.13Windows x86-64

stringzillas_cpus-5.0.7-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.0.7-cp313-cp313-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.0.7-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.0.7-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.0.7-cp313-cp313-macosx_11_0_x86_64.whl (530.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

stringzillas_cpus-5.0.7-cp313-cp313-macosx_11_0_arm64.whl (451.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

stringzillas_cpus-5.0.7-cp312-cp312-win_arm64.whl (411.4 kB view details)

Uploaded CPython 3.12Windows ARM64

stringzillas_cpus-5.0.7-cp312-cp312-win_amd64.whl (565.8 kB view details)

Uploaded CPython 3.12Windows x86-64

stringzillas_cpus-5.0.7-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.0.7-cp312-cp312-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.0.7-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.0.7-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.0.7-cp312-cp312-macosx_11_0_x86_64.whl (530.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

stringzillas_cpus-5.0.7-cp312-cp312-macosx_11_0_arm64.whl (451.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

stringzillas_cpus-5.0.7-cp311-cp311-win_arm64.whl (411.4 kB view details)

Uploaded CPython 3.11Windows ARM64

stringzillas_cpus-5.0.7-cp311-cp311-win_amd64.whl (565.7 kB view details)

Uploaded CPython 3.11Windows x86-64

stringzillas_cpus-5.0.7-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.0.7-cp311-cp311-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.0.7-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.0.7-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.0.7-cp311-cp311-macosx_11_0_x86_64.whl (530.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

stringzillas_cpus-5.0.7-cp311-cp311-macosx_11_0_arm64.whl (451.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

stringzillas_cpus-5.0.7-cp310-cp310-win_amd64.whl (565.7 kB view details)

Uploaded CPython 3.10Windows x86-64

stringzillas_cpus-5.0.7-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.0.7-cp310-cp310-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

stringzillas_cpus-5.0.7-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.0.7-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.0.7-cp310-cp310-macosx_11_0_x86_64.whl (530.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

stringzillas_cpus-5.0.7-cp310-cp310-macosx_11_0_arm64.whl (451.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: stringzillas_cpus-5.0.7.tar.gz
  • Upload date:
  • Size: 1.9 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.0.7.tar.gz
Algorithm Hash digest
SHA256 e1b9ec0692548bd5cd6717c94df823f523bad919c0826ba55d7d9e88f5407920
MD5 09a9a0a8bec9725784b5bb5c1cd8d564
BLAKE2b-256 96125b38264b217d20b633559d2f1dd6f304113ffaf31b473d69834a23c5b7d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 a5a488611b769b8fe20e5a5fc3bd83835d110bccb2fabfe1f4c1e9467af0a81f
MD5 32f0f14e845185254b068ccb93f498b3
BLAKE2b-256 e3a69ab6f9300161f11a228e391f5a85bd13efcd6222d90a22613052cf628f53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c0a9d443c8f0339e5f13b3a1a9ea506b100630122aeea6903e151f188bcb0302
MD5 5f9811aee6dca5f207256970a27e5374
BLAKE2b-256 2bccf7512e327e289ecd61ab8fbfba49707286639526efca09832f6536326298

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ec623646b37abd42d597ead4639aa675d897cd5f050464ec481d05a1515e1480
MD5 e9d23cc53de523f9bdefe9957fe51cec
BLAKE2b-256 dc10e7eb2b71c47db11b4a94a4e0422be18db7ba461fe3de0bf2cbf9a67aa04f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 336b4ad53ccca8a1c19c8311e40f8299cf2a0b32f8442412567191015a6287e2
MD5 cb04b34c5f33ab2d40bc449422760911
BLAKE2b-256 5d4476f465eb0d1dca9c7ad27343774c46555494b74cb8ae40fc34fb4b3b31fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd2af382ce00ec0c34cf279fc594268b17fea40bbdf3f0904df05a92c6256845
MD5 5e143f99bf8fff15794f67af2e83bbcf
BLAKE2b-256 da36d813a6496d5b1b647f17adb7be4c15f8730db434b4d9545785929102fd6d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 902e4cc7518a938076ddd26828fe24e551326482155a14b08e4e472b12b7deee
MD5 dcbc9deb9806c8a4fccd7fbb81a6c69a
BLAKE2b-256 4e49b223e37b53c9e3d3d9d938a2e97dc45d62adebb3c0d9f814827e0721f8d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d54b3c91223f58d5ec9427a3edbbc26633dcec95c9ce052fead378c703076c1d
MD5 5210f566539d135c67b90a280fd0a8d4
BLAKE2b-256 3ee02b0d8e4df76faf6fe02b41f75393bd1482254505848515317e7e5e35ef24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b47df2363d00e7dde1cb1b3594d65f8e0ebda1b58cb559929b0562ab12b48f39
MD5 565f89ce41b8f64509feeb91d071f465
BLAKE2b-256 3503cee9405f35ae4aaeb8a1cc483d9e31f150736785e8c12a84a5bf95851d39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 6ba46c10e0a4c55f0be72007fcd28f8501fc18c433c87405f086f492df04af20
MD5 8b7fe5360b1496ba0ebded750a7342d0
BLAKE2b-256 5bb903c325fd6e714a485b2bcef29e2c93b56197b8ef748c2e8abc9e5dce61d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 dba68bef33f9e1c62f2b72c628ef04dfb3441cb64b2327f4f518c00eb6876976
MD5 643c26c56fd517620f59b4c91448951c
BLAKE2b-256 589d4cb6208887c832bf344dcc257cddd28d0dfa6baaed40fb0bda7613812c9f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 720ca3cd1ae6b06e05fe30c8ae786906d76d5b46561ad379972df7f15c9f6fa9
MD5 0031baba77361bc7cedb7999b0c4b777
BLAKE2b-256 7b193381216fc3cb133ee37ea444f110fd60a064d325e38a779de5420a5c8552

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ddbbc8932686ac9119dec3611632f17aa655b293132c0453bde09376c2d6c8c6
MD5 9828e22d0c118c8531357e89e9189d33
BLAKE2b-256 c2c2f41cffb32925527b945a35825cbec2b44eeed33a13c789ffed35bd2187cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f857f8a7fe9b584ef7c7fe21469397576c9ed50562d8174b910560043450bb12
MD5 1b68ac22a375df9a006ca9027e686776
BLAKE2b-256 e5a6272b98a0e51cbe2cce0904f72563f664a5ce9553b56a6ab8b224ccc9c98e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 49263394e67440e3fd2099d5f6fef5e214cfa227d495f4da5faa0db904276ea9
MD5 05ed1ab4b481f0223212b9ee6ad9e429
BLAKE2b-256 dc752650bb492176e1b8adde0c94a62685b37b0814bc02a0884058bc7827440c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 143d4fdc527805b1d2f61a0cd6dacb4ad6c22a02b77ab38133cb155c342b825f
MD5 b286a3b3fc5209bf0bb72e8e7cc0df66
BLAKE2b-256 923214c1fbb7531bdf1d3f8f2de8a0b2c688a7b3f59fb8ca30042e5b240bde1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dd7762ad5fde179059072b031845727fd7673053beddc56fd8c1fb5213346289
MD5 d20a9717fa868815b95ef3d32d93ee02
BLAKE2b-256 f93c043ee31feebc7639d450017d2658062fe16d5649441d78800c20d231cfc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 07a5cf339c3e547ab4a6e23653a7f90010500b2643583f312b693d77499b9300
MD5 1c0a13ccd3a69bb3986b3903d98c4c1c
BLAKE2b-256 1172da89716767e752ba1b1123b6f4c1619d4f4f16e434b0df328b72b5e0c4f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e486c83b85e634082f72efb5e6192c8cd045c0db1fcab1760d775f30627c7f07
MD5 88df38dc17f002f539cf5f4a7b8f185e
BLAKE2b-256 f41fbc9a4de079c3a8b0b722d9f2c500be00065d8db7d9d3713def4827c5b839

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0c1eeac17924047fb94df59a4f7d0fdbe70ee405c4def30e594f8e3a47ffd79d
MD5 086314a3b34c93c6903275a0879dedc8
BLAKE2b-256 d7d4076a1d4536aa327fe93364d3ba286386f21bed208a1453d027ff7a3ce7f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 dbd97c4c44a1a41b901fcf3235e07b1bccedcf21e6898a703fdac03f266e99a1
MD5 740b8b60f1c9e667faea21747d6f5454
BLAKE2b-256 6ee875e27e044f7c6102de17e8bdd5b187b93f43e01be43d9f51e4c05d35354c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 10fe0a7f4f11058cceae4fbdeeaf5a0645d87a90ffdef3c521411d7d318595a1
MD5 3a3ca746acc61396c461f3ed84389e04
BLAKE2b-256 b396fb201eb9435167fd7883a155e9e5d45022a75ed5d6c126a981b97b0ed3b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ba8e039fd5bd7e3893c11dc4aa1375a6cc074f2dd8f8c63c6705671b29645107
MD5 2d36ac89ff715325d8563bfa2c8185a6
BLAKE2b-256 f89505a74af03f3a1b01bda460e13b3bd3eb591a05096b84ba455aeacfadd5f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 df0f5351b6925bb030e2e0e522bb22826cf1a1b3d396c697f2bc1fe049bc1839
MD5 36d99c6d0b79bbbfae5a3595f329af1a
BLAKE2b-256 8a66bb213a705dd3ba68bfc6c94e3efef6635a32243f4aac8a5331b65a3512de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0a3d7432f42d823bfe84806dbb199521f73145e78788c30dee0c0afcd6f177a4
MD5 5decc72c1656f908c55b94120780aa71
BLAKE2b-256 0a656b5eb09b2583cb4599e7c63038eeda7588b34377a8ff9ec0aad5cb3915e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 91665b409414ca86fd5382982c3626193cdc170a514325fda6de233335ff18dd
MD5 46eb3eaef1f21f87268e515994064067
BLAKE2b-256 65a9a051819acbd3a4ccd8c3513671998c44b0f63289c3d0bfe797d5d2f62033

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e55ae653431935ceacd5c01610e8340ceeeb6e8ed3f7736493d31eea08abe16c
MD5 b8a5a5138865c4b9147c1cb1d51974da
BLAKE2b-256 ca7e6b750da19c94e3c6ff0f2897cf9dd00b83d8ba07b53a87cc584f42cecb05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 450b1b2220294deedd5372d9fdc3276f352ba5ab4cc751b882a1226efea71925
MD5 46327aa0dbcd71bd411362e529bd9cb8
BLAKE2b-256 0bff4492463bc11f5655e726f87fb496e29c9efcba0a6a0090d49d3a36247a43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 aebc89dfdf69ba2e5aefe8796210ab921eb5fc999cfb6889d63a68d4df242b6a
MD5 6b3b794dc60aded97b2fe7dc757c4080
BLAKE2b-256 8e2fd63d83063a8bc4255fddd1db7c7c499e493db8a535ae3bd444f059824c06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1faf3c951967fe5384a0dd520ddf0b963d78679700cfd2c992d17f1330ec8f6a
MD5 f9a438f1628d81609ec55bc59d6d2c9a
BLAKE2b-256 5f1f255de75de50c369b340307ae6a524a277cbf58aac2e82999e76bb231bfb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 62147d5ec19fed5174f76e7dc6cacf20653ed6f48de34da9f443a163ffd7372c
MD5 c69ad317fb3c39776dffc615f5a2afe8
BLAKE2b-256 93ce8dd3bccb828569be42b1122f88fff1a24547ddd9388edfeeba452355baef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 66218cd6f337af3ab36e806294d6515d652adf7a36a4281d19f1cb43b8c6e277
MD5 beb6de3a88d5d52ad3fb77006dc1bae0
BLAKE2b-256 db145ae66894b8adc785bffb59d450ae1419ae8cd5a17b6912a149df756fd172

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bbf302db6fcbc6f78772b1ba06fb5e611363f21e752f69f42a0e70cf456f3faa
MD5 d3974aa658fef981c54ac6eb1dafafd7
BLAKE2b-256 6a5b391ef1c9ebf61c013ddb02ac390d979e5eb6421ed7bd024168b3bff179b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0f1efb20f9726d0d93be36a6f6e5258852fdfc225d71d2a3e9a3462b75785b59
MD5 186021b68c518225907ed858e85f4cd7
BLAKE2b-256 fdef0c377c8e00f21ced3f1cc914252e60fab3e0a8c6329d68f70c4d476298f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d9a93d244c623e438fa47934cacaaab3358a8c01d97bbb0a171778f3a82baea8
MD5 40690413a9db90c6e3274796efc13c98
BLAKE2b-256 5b88669369b2fac42eec84ed6be3be66fd206927ccf7a6ca2fc2f64363af9471

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a4fed7e44cc2a0634325de997e1294fd7a7f0c93e552ee71546df054cc684cbc
MD5 17e5e50396f964dcf04c2976a7a91696
BLAKE2b-256 3325c884949788a9e7b0b20be785ae792df19db4a69b7e231d30aa7916e138a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1002cb29e3cf17700cc5bae30b8dbe92f55fead4d2522cce91398e3cbea98921
MD5 34204937879f9f2ec75db41cabe3ee3c
BLAKE2b-256 05dbc07abc84c43439c8bff3f4d599ebfeb984212311d3f9f81208e8d8009579

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e32bf8a45bff2f09d30e7a9269644cc31c63538c432897ee054db75dbd4b5353
MD5 5a0420ddd9581946f744bae148286bd1
BLAKE2b-256 734aa19ddee946de9b22e0ee067a1832c19a3450d00e7c8b69b1dc6df93bc9b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 af7bf31acaa7acf8eb75ffb37ec2b407be51d53aef9b3e0fdc9c639df00da2dd
MD5 eed035c7cdd353e039242395b4e5107c
BLAKE2b-256 749ebc27f45a19e240cd5b860d54a24ecfaf5d6d1f7e7cf43d1512485ef6e70c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for stringzillas_cpus-5.0.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d4995036b072cb97f280842e7ecda08b1fab7e9a3fcd38fa3195cc8e71922291
MD5 62b8053be8303841ac677812b04431bd
BLAKE2b-256 61e538c12f84e291f03a86a076f7a1bc721a046b8a23f83c0ec38bbe77ff77be

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