Skip to main content

The Mighty Tiny Vector Search Engine with Automatic Quantization and Hardware Acceleration

Project description

USearch

Smaller & Faster Single-File
Vector Search Engine


Discord     LinkedIn     Twitter     Blog     GitHub

  • Single C++11 header implementation, easily extendible.
  • 4B+ sized space efficient point-clouds with uint40_t.
  • Half-precision support with maratyszcza/fp16.
  • View from disk, without loading into RAM.
  • Any metric, includes:
    • Euclidean, Dot-product, Cosine,
    • Jaccard, Hamming, Haversine.
    • Hardware-accelerated ashvardanian/simsimd.
  • Variable dimensionality vectors.
  • Don't copy vectors if not needed.
  • Bring your threads.
  • Multiple vectors per label.
  • Python bindings: pip install usearch.
  • JavaScript bindings: npm install usearch.
  • Rust bindings: cargo add usearch.
  • Java bindings: cloud.unum:usearch on GitHub.
  • GoLang bindings.
  • Wolfram language bindings.
  • For Linux: GCC, Clang.
  • For MacOS: Apple Clang.
  • For Windows.
  • Multi-index lookups in Python.
  • Thread-safe reserve.
  • Distributed construction.
  • AI + Vector Search = Semantic Search.

Features

Define Custom Metrics

Most vector-search packages focus on just 2 metrics - "Inner Product distance" and "Euclidean distance". The lack of dedicated "Cosine distance" can be justified with the simplicity of normalizing such vectors on the fly. But that hardly exhausts the list of possible metrics.

USearch: Vector Search Approaches

Older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing are hardly extendible to vectors/objects of variable length. Modern NSW-like approaches, however, only require two objects to be comparable. This means, the index can be extended to support fuzzy search with Levenstein distance over strings. USearch implements HNSW, and provides some uncommon-to-vector-search "similarity measures" and "distances" out of the box: Haversine, Jaccard, Hamming, etc.

Bring your Threads

Most AI, HPC, or Big Data packages use some form of a thread pool. Instead of spawning additional threads within USearch, we focus on thread-safety of the add function.

#pragma omp parallel for
    for (std::size_t i = 0; i < n; ++i)
        native.add(label, span_t{vector, dims}, omp_get_thread_num());

During initialization we allocate enough temporary memory for all the cores on the machine. On call, the user can simply supply the identifier of the current thread, making this library easy to integrate with OpenMP and similar tools.

Go Beyond 4B Entries

Constructing a vector index is a memory-intensive task. Depending on your configuration parameters, part of the memory will be allocated towards copies of vectors, and another part to the Small World Graph, common to NSW-like algorithms. Choosing the right data-structures and numeric types can have profound implications on both.

USearch uint40_t support

Internally, some point "label" is mapped into an integer identifier for every stored vector. Most implementations hard-code it to uint32_t, as people rarely store more than 4 Billion vectors. But when they do, software becomes unusable. Others hard-code it to uint64_t, which hardly space-efficient. We added a tiny class - uint40_t, that should be enough for collections up to 1 Trillion vectors.

View Larger Indexes from Disk

To construct a large index one may use a beefy RAM-optimized machine, like the AWS u-24tb1.metal instances with 24 TB of RAM. Those are, however, pricy, and would cost you over $200/hour.

To Build To Serve
Instance u-24tb1.metal is4gen.8xlarge
Price ~ $200/h ~$4.5/h
RAM 24 TB 192 GB
SSD EBS 30 TB

You wouldn't want to have them running all the time. So, if you are working on large datasets, but don't need the in-RAM throughput, you can simply view an existing dataset from disk, without ever loading it fully into memory.

Construct on large machines, deploy on the cheap ones.

Quantize on the Fly

Most modern CPU have at least partial support for half-precision f16_t arithmetic. USearch supports automatic down-casting and up-casting between f32_t, f16_t, f64_t, and i8q100_t representations.

Making vectors smaller will help pack more of them in-memory, while also increasing performance on CPUs implementing native support for target type.

Performance

Below are the performance numbers for a benchmark running on the 64 cores of AWS c7g.metal "Graviton 3"-based instances. We fix the default configuration in the top line and show the affects of various parameters by changing one parameter at a time.

Vectors Connectivity EF @ A EF @ S Add, QPS Search, QPS Recall @1
f32 x256 16 128 64 75'640 131'654 99.3%
f32 x256 12 128 64 81'747 149'728 99.0%
f32 x256 32 128 64 64'368 104'050 99.4%
f32 x256 16 64 32 128'644 228'422 97.2%
f32 x256 16 256 128 39'981 69'065 99.2%
f16 x256 16 64 32 128'644 228'422 97.2%
f32 x256 16 256 128 39'981 69'065 99.2%

The main columns are:

  • Add: Number of insertion Queries Per Second.
  • Search: Number search Queries Per Second.
  • Recall @1: How often does approximate search yield the exact best match?

To read more and reproduce, jump to benchmarking section.

Usage

There are two usage patters:

  • Bare-bones with usearch/usearch.hpp, only available in C++.
  • Full-fat version with it's own threads, mutexes, type-punning, quantization, that is available both in C++ and is wrapped for higher-level bindings.

C++

To use in a C++ project simply copy the include/usearch/usearch.hpp header into your project. Alternatively fetch it with CMake:

FetchContent_Declare(usearch GIT_REPOSITORY https://github.com/unum-cloud/usearch.git)
FetchContent_MakeAvailable(usearch)

The simple usage example would require including the unum::usearch namespace and choosing the right "distance" function. That can be one of the following templates:

  • cos_gt<float> for "Cosine" or "Angular" distance.
  • ip_gt<float> for "Inner Product" or "Dot Product" distance.
  • l2_squared_gt<float> for the squared "L2" or "Euclidean" distance.
  • jaccard_gt<int> for "Jaccard" distance between two ordered sets of unique elements.
  • bit_hamming_gt<uint> for "Hamming" distance, as the number of shared bits in hashes.
  • pearson_correlation_gt<float> for "Pearson" correlation between probability distributions.
  • haversine_gt<float> for "Haversine" or "Great Circle" distance between coordinates.

That list is easily extendible, and can include similarity measures for vectors that have a different number of elements/dimensions. The minimal example would be.

using namespace unum::usearch;

index_gt<cos_gt<float>> index;
float vec[3] = {0.1, 0.3, 0.2};

index.reserve(10);
index.add(/* label: */ 42, /* vector: */ {&vec, 3});
index.search(
  /* query: */ {&vec, 3}, /* top */ 5 /* results */,
  /* with callback: */ [](std::size_t label, float distance) { });

index.save("index.usearch"); // Serializing to disk
index.load("index.usearch"); // Reconstructing from disk
index.view("index.usearch"); // Memory-mapping from disk

The add is thread-safe for concurrent index construction. For advanced users, more compile-time abstraction are available.

template <typename metric_at = ip_gt<float>,            //
          typename label_at = std::size_t,              // `uint32_t`, `uuid_t`...
          typename id_at = std::uint32_t,               // `uint40_t`, `uint64_t`...
          typename scalar_at = float,                   // `double`, `half`, `char`...
          typename allocator_at = std::allocator<char>> //
class index_gt;

One may also define a custom metric, such as Damerau–Levenshtein distance, to compute the similarity between variable length strings. The only constraint is the function signature:

struct custom_metric_t {
    T operator()(T const* a, T const* b, std::size_t a_length, std::size_t b_length) const;
};

Python

Python bindings are implemented with pybind/pybind11. Assuming the presence of Global Interpreter Lock in Python, on large insertions we spawn threads in the C++ layer.

$ pip install usearch

import numpy as np
import usearch

index = usearch.Index(
    dim=256, # Define the number of dimensions in input vectors
    metric='cos', # Choose the "metric" or "distance", default = 'ip', optional
    dtype='f16', # Quantize to 'f16' or 'i8q100' if needed, default = 'f32', optional
    connectivity=16, # How frequent should the connections in the graph be, optional
    expansion_add=128, # Control the recall of indexing, optional
    expansion_search=64, # Control the quality of search, optional
)

n = 100
labels = np.array(range(n), dtype=np.longlong)
vectors = np.random.uniform(0, 0.3, (n, index.ndim)).astype(np.float32)

# You can avoid copying the data
# Handy when build 1B+ indexes of memory-mapped files
index.add(labels, vectors, copy=True)
assert len(index) == n

# You can search a batch at once
matches, distances, counts = index.search(vectors, 10)

JavaScript

// npm install usearch

var index = new usearch.Index({ metric: 'cos', connectivity: 16, dimensions: 2 })
assert.equal(index.connectivity(), 16)
assert.equal(index.dimensions(), 2)
assert.equal(index.size(), 0)

index.add(15, new Float32Array([10, 20]))
assert.equal(index.size(), 2)

var results = index.search(new Float32Array([13, 14]), 2)
assert.deepEqual(results.labels, new Uint32Array([15, 16]))
assert.deepEqual(results.distances, new Float32Array([45, 130]))

Rust

Being a systems-programming language, Rust has better control over memory management and concurrency, but lacks function overloading. Aside from the add and search, it also provides add_in_thread and search_in_thread which let users identify the calling thread to use underlying temporary memory more efficiently.

// cargo add usearch

let quant: &str = "f16";
let index = new_ip(5,  &quant, 0, 0, 0).unwrap();

assert!(index.reserve(10).is_ok());
assert!(index.capacity() >= 10);
assert!(index.connectivity() != 0);
assert_eq!(index.dimensions(), 5);
assert_eq!(index.size(), 0);

let first: [f32; 5] = [0.2, 0.1, 0.2, 0.1, 0.3];
let second: [f32; 5] = [0.2, 0.1, 0.2, 0.1, 0.3];

assert!(index.add(42, &first).is_ok());
assert!(index.add(43, &second).is_ok());
assert_eq!(index.size(), 2);

// Read back the tags
let results = index.search(&first, 10).unwrap();
assert_eq!(results.count, 2);

// Validate serialization
assert!(index.save("index.usearch").is_ok());
assert!(index.load("index.usearch").is_ok());
assert!(index.view("index.usearch").is_ok());

// There are more "metrics" available
assert!(new_l2(5,  &quant, 0, 0, 0).is_ok());
assert!(new_cos(5,  &quant, 0, 0, 0).is_ok());
assert!(new_haversine(&quant, 0, 0, 0).is_ok());

Java

Index index = new Index.Config().metric("cos").dimensions(2).build();
float vec[] = {10, 20};
index.add(42, vec);
int[] labels = index.search(vec, 5);

GoLang

Wolfram

Benchmarking

All major HNSW implementation share an identical list of hyper-parameters:

  • connectivity (often called M),
  • expansion on additions (often called efConstruction),
  • expansion on search (often called ef).

The default values vary drastically.

Library Connectivity EF @ A EF @ S
hnswlib 16 200 10
FAISS 32 40 16
USearch 16 128 64

To achieve best results, please compile locally and check out various configuration options.

cmake -B ./build_release \
    -DCMAKE_BUILD_TYPE=Release \
    -DUSEARCH_USE_OPENMP=1 \
    -DUSEARCH_USE_JEMALLOC=1 && \
    make -C ./build_release -j

./build_release/bench --help

Which would print the following instructions:

SYNOPSIS
        ./build_release/bench [--vectors <path>] [--queries <path>] [--neighbors <path>] [-b] [-j
                              <integer>] [-c <integer>] [--expansion-add <integer>]
                              [--expansion-search <integer>] [--native|--f16quant|--i8quant]
                              [--ip|--l2|--cos|--haversine] [-h]

OPTIONS
        --vectors <path>
                    .fbin file path to construct the index

        --queries <path>
                    .fbin file path to query the index

        --neighbors <path>
                    .ibin file path with ground truth

        -b, --big   Will switch to uint40_t for neighbors lists with over 4B entries
        -j, --threads <integer>
                    Uses all available cores by default

        -c, --connectivity <integer>
                    Index granularity

        --expansion-add <integer>
                    Affects indexing depth

        --expansion-search <integer>
                    Affects search depth

        --native    Use raw templates instead of type-punned classes
        --f16quant  Enable `f16_t` quantization
        --i8quant   Enable `int8_t` quantization
        --ip        Choose Inner Product metric
        --l2        Choose L2 Euclidean metric
        --cos       Choose Angular metric
        --haversine Choose Haversine metric
        -h, --help  Print this help information on this tool and exit

TODO

  • JavaScript: Allow calling from "worker threads".
  • Rust: Allow passing a custom thread ID.

AI + Vector Search = Semantic Search

AI has a growing number of applications, but one of the coolest classic ideas is to use it for Semantic Search. One can take an encoder model, like the multi-modal UForm, and a web-programming framework, like UCall, and build an image search platform in just 20 lines of Python.

import ucall.rich_posix as ucall
import uform
import usearch

import numpy as np
from PIL import Image

server = ucall.Server()
model = uform.get_model('unum-cloud/uform-vl-multilingual')
index = usearch.Index(dim=256)

@server
def add(label: int, photo: Image.Image):
    image = model.preprocess_image(photo)
    vector = model.encode_image(image).detach().numpy()
    labels = np.array([label], dtype=np.longlong)
    index.add(labels, vector, copy=True)

@server
def search(query: str) -> np.ndarray:
    tokens = model.preprocess_text(query)
    vector = model.encode_text(tokens).detach().numpy()
    neighbors = index.search(vector, 3)
    return neighbors[0][:neighbors[2][0]]

server.run()

Check that and other examples on our corporate GitHub 🤗

Project details


Release history Release notifications | RSS feed

This version

0.1.9

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

usearch-0.1.9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (126.4 kB view details)

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

usearch-0.1.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (120.7 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.24+ ARM64 manylinux: glibc 2.28+ ARM64

usearch-0.1.9-cp311-cp311-macosx_11_0_arm64.whl (114.8 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

usearch-0.1.9-cp311-cp311-macosx_10_9_x86_64.whl (123.1 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

usearch-0.1.9-cp311-cp311-macosx_10_9_universal2.whl (230.2 kB view details)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

usearch-0.1.9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (126.4 kB view details)

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

usearch-0.1.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (120.7 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.24+ ARM64 manylinux: glibc 2.28+ ARM64

usearch-0.1.9-cp310-cp310-macosx_11_0_arm64.whl (114.8 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

usearch-0.1.9-cp310-cp310-macosx_10_9_x86_64.whl (123.1 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

usearch-0.1.9-cp310-cp310-macosx_10_9_universal2.whl (230.2 kB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

usearch-0.1.9-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (126.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.28+ x86-64

usearch-0.1.9-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (121.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.24+ ARM64 manylinux: glibc 2.28+ ARM64

usearch-0.1.9-cp39-cp39-macosx_11_0_arm64.whl (114.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

usearch-0.1.9-cp39-cp39-macosx_10_9_x86_64.whl (123.2 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

usearch-0.1.9-cp39-cp39-macosx_10_9_universal2.whl (230.5 kB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

usearch-0.1.9-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (126.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.28+ x86-64

usearch-0.1.9-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (120.6 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.24+ ARM64 manylinux: glibc 2.28+ ARM64

usearch-0.1.9-cp38-cp38-macosx_11_0_arm64.whl (114.7 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

usearch-0.1.9-cp38-cp38-macosx_10_9_x86_64.whl (123.0 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

usearch-0.1.9-cp38-cp38-macosx_10_9_universal2.whl (230.0 kB view details)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

usearch-0.1.9-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (130.6 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.28+ x86-64

usearch-0.1.9-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (123.8 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.24+ ARM64 manylinux: glibc 2.28+ ARM64

usearch-0.1.9-cp37-cp37m-macosx_10_9_x86_64.whl (122.4 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

usearch-0.1.9-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (130.5 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.28+ x86-64

usearch-0.1.9-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (123.9 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.24+ ARM64 manylinux: glibc 2.28+ ARM64

usearch-0.1.9-cp36-cp36m-macosx_10_9_x86_64.whl (122.4 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

Details for the file usearch-0.1.9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b0df5a27740b5e3341336ffbabc4c83017e4757d29dbb9ef39be8377bdd8e35
MD5 1c8ef6a6a99867083c3ef6f98677626d
BLAKE2b-256 21e5d62555d1021913bd378b2a91a99e1353412900706ff1b61fcb0a4c03aa69

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2c345c852698748a4ff7a577af2e993affdc0e38f1d06ad3ed1f86fca211e396
MD5 531db6cb8749a5ebcf0f37bc62a409bd
BLAKE2b-256 923f4713b537e29b4fcbe529cfe7dbc16bf780d12c7cdcf118d568fe2d7c6890

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 58c0e396f3ae4431af79f64ad3d389ef9798a89e6908fcd17a1615388e88d2e9
MD5 91352d0ef191fe0d44fbd78d3e5b9ec9
BLAKE2b-256 8e1adb250d929f7f16fe7f0fc60ea7d1ff03ba5b8111ce97d9a1f80e276309b3

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6e6097ed679192e2766d368beffd296346357684165a4978e4476860c13f3f04
MD5 bf49a835542e527befa59aa50728ea74
BLAKE2b-256 f327b17dd336475f9b08ba01e55ac0b421bc63aee0de30f39a04fd39766fdd5c

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 8a7519db65e8afc96b6f17dc93f5223927731440cf30581b8e6b79a1a18d6dbd
MD5 ac138e2a7ac29e38cb5b6759790ce3eb
BLAKE2b-256 e45ad65fcf449bd1f87c57cdd5dbaeee20ea75a606848d67af5c92b8fba6d8ae

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b0cd0c2d0079c509c54fc060ab24e4d2bc86ccd827ec1468c7b5d2227ffe28cf
MD5 9bcaf1a0ec57102141b3f6a583c32963
BLAKE2b-256 b8878d46326a91723b3a3790dfe0a04cebfbf1465515b6ebb802f28ea5c6b68f

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 20d8e95247b394af4e5d0beb44177dd40690cebe83b17cc6c21b7c0ba1b5d51a
MD5 5fdd9ca0593d7a98c4cf67512cd124b0
BLAKE2b-256 218a0d1ffdd119dca471ea6532e314f2925f4b3ef6ff2f523d38b51900653800

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dee460a11d448568fc9140e60f6c18c2ea85630a884b92493e00c461fb1e1eb8
MD5 72980f7421b5e431a3658cccc0cd6b57
BLAKE2b-256 427125d04dc0875b0ec1762fb415cf6ffbb65f0ea6ec533ed19e7e7168c18ab9

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c765e0c5d103f23281b9aa9644bd0d20dc4a833daf270cb22008e178fa75bdbe
MD5 53ade6bb24d40685660e1ef154d2a049
BLAKE2b-256 95f1fad188332e48979fd8e51b212a0c1983da963368b9af91628317584c3b25

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3bbe6ee2064282ff4eaa50578cd4b2fda6b86aca4dd00259813dcd42fbd4165d
MD5 9ceeeeab28c937ab091aacf084541e52
BLAKE2b-256 2dc8e4df38dc2f9d96bf13bfd733b4c17b9a08f3dcc54d7d8b018cd5009c79a9

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd0c9eb7547a1b8abd2e655b732c391d3abd82c2d6af85cfc466f351ffa0850b
MD5 c27cd153a2dc72940d467784f6cbe1e2
BLAKE2b-256 5a61183cb9279d026f4d0ed216fcc80dc7925b2c83df1ac3bd57b96241d7bfec

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a9136ce50353c5e982e18c4bd8b61ee029f9b174cafdcd318467432edc7ccf38
MD5 836de50c3e7401b944f7fb6bcca62041
BLAKE2b-256 4683e7679133f0cb1ff9504337764f1c72daa852e707d14df1e1e8704812afa4

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4d4ec0eefcd975dc724f86ba3269e4240b8caa5b88ac5098d871ac9074e27e14
MD5 dd64501d401fd89b24139bfe6f44a845
BLAKE2b-256 b00a675007eaf200a7fc40541cbbc229dc510a5d3516d0037811f74cbbe81816

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 392590300c085b77d9ff23b22b338fb23ccfebf6e242c381c69198eff54fc711
MD5 fc3d9048a22d0b25b7bbf1223957cf7f
BLAKE2b-256 12a498b809f99b9df15c7d8f263755d03631fbfe6bdde56e91e4e66283fc5a18

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 207fac33b4231ad58355c2b606cfbc7e4a90fa3ec8a107771ca49e7ff696dda9
MD5 f40de6f1fa1423a9762c03b06d878340
BLAKE2b-256 a476b695b8048bc8916ea3c170ddb07f868bb64232db558c0b286d47d1982eb5

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f541d9616cb7c57bb8f2e5e37b3a2e7a18ea0a064d5766c3a118a6d2120466a3
MD5 4f43a22057b77f7ff3cf30f7957d3347
BLAKE2b-256 2e675934c6f8bfd984102dd36cf04772b8aebaef0aff374adc513b1c1271c1b7

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 50ec8a204daaebb8c296ef07d8126d424e1262b4412680bb93e69995332b5511
MD5 c063318d758d3ca458a6d3777e3b6475
BLAKE2b-256 fa07d3d160ff5cc4c91adf37a38a6fac8b35ea2a735907b68a4f8960420a7ca4

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 400e7e378896cf7d471ee77d619a4f62642217df0da4899d1375ce4b9cf4cc4b
MD5 39a358acd9a79c2af9c56024dd2c91e4
BLAKE2b-256 ccd84507a8426c478b7b3f75a84429d7ba13b3f831a402fcfef5bd01a942775f

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 73d718d96582e27c8ecbed21df1c4c2219eb45ad16e232860b3c37ed94cc1c7e
MD5 2101e534149c9556b2fc3a6b27c96393
BLAKE2b-256 778c140af3bc0f876a3f98a72516880e47cf9edab2769fa6e9f724c61007f4dc

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp38-cp38-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 2d1b92038e7d9638dff7dc5ba9e1d157d298763cc8f61225532b15540b38c822
MD5 955b1b75f8383e0189ff4d3852ca06ba
BLAKE2b-256 f4c9b2bf580f405663ce223a9bb64c9e0b97f4517b4cf6cd146116f28fc34a55

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1beb2292cfe8eaf397b4c6224008a9bc35d99baf0c59754c73e64620594bfaa6
MD5 efadfabe5ff25a639e638636f9878228
BLAKE2b-256 61f20877af5d43b745b7d40ed8105b1789bff61e2afa7d35bb5d5d8bd4ac797b

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6021d025ae13ce447b6156b24020a30655e60b1caff4fe806f80b81c19af650a
MD5 bc832d9b4f5704745650c6ebb6538a6d
BLAKE2b-256 b4b0d36c6deb198f07c236a5d560288280d5c09bc0cc119dab92f5343579a4b7

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1b70b09fe4ec1a672a2eca44f0cd613b1a1a76abccb9fddbb47b2582490ae998
MD5 ac056d38054abb0fb87528d6c4c04ef5
BLAKE2b-256 b5fef4c6d9d5c7d9880a723b7b9442f9b7045d4fb7d3cdf6d58d871d2955af19

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 06d1f5f0ae1cff1e615ae204637f062a41624a4d61ae0aa89a3fb24c63ea1f08
MD5 6d85e76bbe3188ef08e19fbbdbe35342
BLAKE2b-256 4ea5bd32a4b52e9cf85be881645da1520ff4c7150c6f084ac2b7ab3d122a752d

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6945e66dd5d1c721174059faf940c036493ef4d96f847c6a5df6d49bbf1c92bd
MD5 cccc131b14c95a00d8d5ca614dfa9cf9
BLAKE2b-256 ef39bff9d4eca58bff0782a76d9cb213e23d54e09c654fb303dbb235f3f8e933

See more details on using hashes here.

File details

Details for the file usearch-0.1.9-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.1.9-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c4a2bee92178bbc38e354add78e87cfbc7beafcc431fa7bb8f0818fa1276569c
MD5 7666e104dd57524e000b0cf8593346c5
BLAKE2b-256 a9112716f36daa435b84330bde562e42619c306afef46f97b5fd842efbc7495f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page