Skip to main content

Smaller & Faster Single-File Vector Search Engine from Unum

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, like OpenMP.
  • 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 with MPI.
  • 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(
    ndim=256, # Define the number of dimensions in input vectors
    metric='cos', # Choose the "metric" or "distance", default = 'ip', optional
    dtype='f32', # 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
)

vector = np.random.uniform(0, 0.3, (index.ndim)).astype(np.float32)
index.add(42, vector)
matches, distances, count = index.search(vector, 10)

Same can be done with batches, rather than single entries. Under the hood, worker threads will be spawned, to parallelize the procedure.

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)
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(ndim=256)

@server
def add(label: int, photo: Image.Image):
    image = model.preprocess_image(photo)
    vector = model.encode_image(image).detach().numpy()
    index.add(label, vector.flatten(), 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.flatten(), 3)
    return neighbors

server.run()

Check that and other examples on our corporate GitHub 🤗

Project details


Release history Release notifications | RSS feed

This version

0.2.0

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.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (168.8 kB view details)

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

usearch-0.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (159.1 kB view details)

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

usearch-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (150.5 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

usearch-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl (166.3 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

usearch-0.2.0-cp311-cp311-macosx_10_9_universal2.whl (304.9 kB view details)

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

usearch-0.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (168.8 kB view details)

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

usearch-0.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (159.2 kB view details)

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

usearch-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (150.5 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

usearch-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl (166.4 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

usearch-0.2.0-cp310-cp310-macosx_10_9_universal2.whl (305.0 kB view details)

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

usearch-0.2.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (168.8 kB view details)

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

usearch-0.2.0-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (159.0 kB view details)

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

usearch-0.2.0-cp39-cp39-macosx_11_0_arm64.whl (150.7 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

usearch-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl (166.5 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

usearch-0.2.0-cp39-cp39-macosx_10_9_universal2.whl (305.2 kB view details)

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

usearch-0.2.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (168.4 kB view details)

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

usearch-0.2.0-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (159.0 kB view details)

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

usearch-0.2.0-cp38-cp38-macosx_11_0_arm64.whl (150.5 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

usearch-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl (166.2 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

usearch-0.2.0-cp38-cp38-macosx_10_9_universal2.whl (304.7 kB view details)

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

usearch-0.2.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (173.4 kB view details)

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

usearch-0.2.0-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (161.9 kB view details)

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

usearch-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl (164.8 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

usearch-0.2.0-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (173.4 kB view details)

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

usearch-0.2.0-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (161.8 kB view details)

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

usearch-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl (164.8 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 208f9bfadf921ce26e74d15036156c67302c6c76bc2725830d2899a6445945fb
MD5 ea4b8bea50569fcdb8a9f4fa929dd1e6
BLAKE2b-256 733fbe7830886d64862d007d20b9949b19bad58ac709db51b1f7864a9a7c7db4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 00319d0222f3b0218cb5f37f845ed5ecbcdc3aa44a8bef98b57eb8a72a500546
MD5 e51ace7e2a5e94d97618c600fcf3a0c7
BLAKE2b-256 1aebb927175e74ae714e472411ab33747e8840255adec1d9ad63cdf394392db2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66c02699291abe8b6f18b620e9baf44b6302257818d716dbc952106bd6d9a0bc
MD5 3133741b0a9c3bd8a5b84b0d0535ce7c
BLAKE2b-256 a83d550235ed9d99db4978bfa4602fb68cbb88f7bb4de3aa960a8adbff767213

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 577784d2f81df94c1abf1f706edbbdb996ac8ae83c2e7087267c045647dcd53a
MD5 9b89ab27c35832cf26802de9f5557321
BLAKE2b-256 45b42882160373f225a2e9729ceaf856cedd526b2f9b0837f4562c124e26758a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 8f966eb3a9fe91677ddc31ed900e85f21b83b39ebfb788098715c362834fe118
MD5 9d3b8c0d5128e8ba66d7c2ca4e1bb61b
BLAKE2b-256 707b4faf0021875d7a651433fda3511ad205abb0ddfac46dd414fa9d29e9e37f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3e994f5cce590136c16e27e7a874797b1854b38ab857213bcc8ed05b74ca75d7
MD5 38967b0eb75b625fc0628ed646c94313
BLAKE2b-256 891e365c207482b7952d44e78e6d1d582dad80bb492a2b8967cc56dde4512ad7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ae89b19032499071e94f156a42e81b08fef78693eec095b394ba0a5fa5502a16
MD5 ccc439229401c8c7023e3fbc4ae2d4c9
BLAKE2b-256 e2f80299cac29bf6d034f172b11b1ee94ddb2c43a322bfadc00a85fbc195b3f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c752d6a8dc69bf6739a4cc3a30e7b4e4453c9630bdaf5cf5bf60f8a3e12913d6
MD5 f915c42827bd46b093826a31243f2035
BLAKE2b-256 790a459c12d59ba50a1f2a56992c3811a80cf7a851842b45048bcc67f2f80217

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cc9e69a6563d8850dbff878c424481182999386903b43ddcd171d2c929726b16
MD5 22a02dbcb0f1c9e0b09f61bcced41d29
BLAKE2b-256 5032e57f6995363763812fe56638e629f270fc6589a1dc967ad49719182b09a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6cc1f17f79e1197313edd0b4afc7903c0004e99384fdfbebe101bbba782064f1
MD5 8fd6ee5f38d2dc1e93a3ede1e73d5751
BLAKE2b-256 90ec98ddaa31d5ffd9da0b87c2e7dcd6ab6fd2cce8409cf47853b37902f0b35a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8fbcd72762d0447db7ccad981095f5debc7c16fdc1dada46b8530b2b16fab682
MD5 fd017bf9a4b05077605d545c49ece8a7
BLAKE2b-256 17a11c6f174097655bb40bb5ab8b1d530db368371f41002c1fb828c4c527bfb0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c2483f7882fa327dcc164fd3d635866d79fb96c65f68e633d368d84752a242f1
MD5 4d785c7204814a578a7b69c6be593f39
BLAKE2b-256 197688c6a42b773371bdfb125bbfc081be78a1e97eb99a3faf9b75596b2fd5b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 561324c5fabf9ca3c33ac8cb96741f634e9cac0dabfa2ae2090e5a006ab65129
MD5 ada23dc90727cd5e08c3ca7a9da614d8
BLAKE2b-256 be546ca71829f524792b5c31714225e7b4a39fe81babacbe84f3f0156c2352b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c5be93a0739009f63b9cf7a8b29054be96862637800730edef8905d4a3cdbd53
MD5 f4f4b4c30789d50179429e4a4f156acb
BLAKE2b-256 7534ec084f7c61906993dc81592e46c14fc1513d98627eb128295747d92017df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 0277f4cdc0f08325a504023305c6247c36357e56fac1d90efd6deeedf35c5392
MD5 fcc85b97c3fd5e1747b3e4c791630f5d
BLAKE2b-256 ab8dcc13942776c63751bcc04b803571f7a9014d471252eb15a80d3988eeca7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bb9806ea8f8a6b8d06239fc15204828cda0517ecb3980b712ae253a922349eef
MD5 90bf120869684afeba514d88d8f2109f
BLAKE2b-256 c78223f853aadc0e90c1f70a8fc5a0c7fdc693b2a18794be387d43160b4b8138

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 77f5db16a86bea0f0af0533324a92093f31f3e6af9320f8654468a636c8a180c
MD5 4c27afb70f2688a0008e5e9f167a8dbf
BLAKE2b-256 b4d6cde9fce037000d54c07a6c3493b1c48c6bda73d0e0379b1526162668cd2d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 528bb74d79f151d2c3b18fc35d87786f20f60e89d117cd9d401457ace8374f9a
MD5 455359c5f06475da4b7418daa1ed46ed
BLAKE2b-256 319ac657641ca56f961e8d41f7fb5c0a57fc897ebc5870e8365a15d7ba6154ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c078e19cc11e20692ee96a8a476c1b858ee0c1f5d5f8d726d9636f350c57c773
MD5 027412cd1d9dbe74709e33fc95b8f09f
BLAKE2b-256 3e2dbca1cfae5507fdc46fefcf0eec569edd140e7e785edcd3ccca01917d1508

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 bce5b8d949e68a7fd81f8cd094cae55ad72bca8519bfd00362204a3630c0dbe3
MD5 a779aa43aa2da7d3f9786b377515c5ee
BLAKE2b-256 0e7380b6ee2f6631d5c96311ff6f38f72d39725e2c09579daf7a00a3b0efc0d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e75a3174416e6a8bdeda31e44b4067e9e12e02f4103a8a431edfb8f9875f6f22
MD5 636591cbd6c2264df0a150cffa5ce177
BLAKE2b-256 0a92b30a1d2790e3f84ac820a026a584bd020e4ae2f5f2f8d097017e6a42532c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f6c9734378ac8fb4714318f0fc3f3fbb669dc53e70974dc6303283f90d67b67f
MD5 d40e8a5c74daf3cbd7c2513fd5fe5825
BLAKE2b-256 491bd40a6608d74c456abb5143b63d13d76a34ff15b556a621039b53ba07d8cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 76823e5c302a4e64194c6e122705f7eea4988c5ed38222bdf4ad867f516609b0
MD5 831348f459da2079a41794aa4e68f345
BLAKE2b-256 e10035064ffbaabb44f93662bdd51f995c1310aaeeaf03ac242dd377d9e0bb8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 96a5b95964e6acd3c2cbe3d3a5dff860d929c48d4e692f50d1a793e87efaa44b
MD5 e76ffc5791a0a1e84a5a8d4d1095b098
BLAKE2b-256 f46016e11b043b53d283cf78222738c84abdcb67079507ddfd71f7ce9dbbd6f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 509f528b93b93be77d5b39285740ca00f1c659b3af3fe6c7ca157235ee980da8
MD5 39a76fac010c0e13670ed66a15836c45
BLAKE2b-256 56dacd09b229e6e4bc6796955e5265cb37015987d729a4ff957de52ca9b50220

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 18379b1e5915a1e641d659e5aeefee0590acfaac39b249e991d9f9a5417ef5b0
MD5 67c1d54b280738e58744bb790f2bdbaf
BLAKE2b-256 2246f972239861d357ab2e0bc85fc5b94ff19dc897755070206d129fd8239b69

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