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);

Objective-C and Swift

let index = Index.l2(dimensions: 4, connectivity: 8)
let vectorA: [Float32] = [0.3, 0.5, 1.2, 1.4]
let vectorB: [Float32] = [0.4, 0.2, 1.2, 1.1]
index.add(label: 42, vector: vectorA[...])
index.add(label: 43, vector: vectorB[...])

let results = index.search(vector: vectorA[...], count: 10)
assert(results.0[0] == 42)

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

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.1-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.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (159.2 kB view details)

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

usearch-0.2.1-cp311-cp311-macosx_11_0_arm64.whl (150.8 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

usearch-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl (167.1 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

usearch-0.2.1-cp311-cp311-macosx_10_9_universal2.whl (305.8 kB view details)

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

usearch-0.2.1-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.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (159.1 kB view details)

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

usearch-0.2.1-cp310-cp310-macosx_11_0_arm64.whl (150.8 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

usearch-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl (167.1 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

usearch-0.2.1-cp310-cp310-macosx_10_9_universal2.whl (305.7 kB view details)

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

usearch-0.2.1-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.1-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (159.5 kB view details)

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

usearch-0.2.1-cp39-cp39-macosx_11_0_arm64.whl (150.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

usearch-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl (167.3 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

usearch-0.2.1-cp39-cp39-macosx_10_9_universal2.whl (306.0 kB view details)

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

usearch-0.2.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (168.6 kB view details)

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

usearch-0.2.1-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.1-cp38-cp38-macosx_11_0_arm64.whl (150.8 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

usearch-0.2.1-cp38-cp38-macosx_10_9_x86_64.whl (166.8 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

usearch-0.2.1-cp38-cp38-macosx_10_9_universal2.whl (305.6 kB view details)

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

usearch-0.2.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (173.7 kB view details)

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

usearch-0.2.1-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (162.2 kB view details)

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

usearch-0.2.1-cp37-cp37m-macosx_10_9_x86_64.whl (165.5 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

usearch-0.2.1-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (173.6 kB view details)

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

usearch-0.2.1-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (162.1 kB view details)

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

usearch-0.2.1-cp36-cp36m-macosx_10_9_x86_64.whl (165.6 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5c413f5f78c69a2a502264a349dcf758d983a709a52f90af0183509111b9b0c9
MD5 3a4814be5a1c033c6dbe2a1da4464a01
BLAKE2b-256 bc6032ede798807699325ff0a6e0e47c02eaddf26b9d941d7d5f378bfefd9b3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 763bc840345c6f4f0b2a31e1f9bbf0f200baa19f5d079b1a1ccd0b26bbc0039e
MD5 496c646a9e4b5b0f9f81908ae573e57e
BLAKE2b-256 dd9b0830da27bd180754cdc146e3d5546e5d13341e63f18279584de1b1ffaec4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 afab63d54257a21b7a3debf55fc731f107ccfc510ac709b892130012a23437c1
MD5 6bbb59272df6f7dc6db8a88823bb36de
BLAKE2b-256 c739b987422846b6ce455bfddfe9618fff9a8417d4c5a3cdaeeecea24c0e5c41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8b28dddd7cf192086a0d121e4b8a629cbbf103fe44d5cf0742e50d332ff5efed
MD5 f4773a72b94ec536cdf6dae51d312e5b
BLAKE2b-256 7a20faef65c71f247f30de189d7867d7ace908aeb96023f66841a89c2179266d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 939017c7e4a24ed75aa76dcd3b026d4ba25cbac8d6f0d270134fa9038b59f88b
MD5 dd0d2050531ef76336c916226914a585
BLAKE2b-256 a08e17356783112edef43e06de29b2bef5bec206deafd655b6497be211f4230c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 659407051a7afe9da1fc3389bb0f5f163c179fd79f6e0f268042a9972a2e314b
MD5 f3143eb062b7798c6352622d13f2c45a
BLAKE2b-256 f3c66242eecca7c4ebc82629893b7c3000a4c6df0c67810cf3921e1b002ad33b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 89343fa36dfbd898ee64d3a7d05dbeecbe888a687a57d09806aa8ebe8ffdcb66
MD5 82b549b8c1d9d346cae34850810ca8b6
BLAKE2b-256 3fac369d326541c25e383e09d87cdc5f672f333bca4bc03491cb2f863ad67bae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c8d680cde8db173fb6eba47df19d6e969a9a20feb41b5321829ef780300e383d
MD5 92f570650a50b24cdd13a375bd3ae480
BLAKE2b-256 f6ded9b9b01223fa0318808591c0f01a3b54c7bbaf1951e07edfb12c9858c370

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 29a34390856a73177fccfdd839c3aec0c61bf2d17ff7ba9dbabec748045c6fe6
MD5 919a2eaa21f1378c0e2dac1b4ca4e453
BLAKE2b-256 00abbb05f4ea9bdc67a86e21cbfba4447a597f95eaf45f5ccf8294870cc304f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a2094d8eebb630fc1a41d7c0f1f40086a5205d160a5fca0085254e195ca1bbc3
MD5 085b0ee3a16ee87e3d9f0151c872492f
BLAKE2b-256 e8c2e12de1e25667dedf24063bc14fc74ab39a048b12636326f6d2fff4eb15e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a8a3bab265927ba681fddf61de3ca5e045ecf465e812517218ba99640ee40433
MD5 a94c84537d0d69f24b20478d5e657972
BLAKE2b-256 cc274053a6dae07cb4ea6560298b0e5a9aef6f85419913229c9431222ed0779d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 84c9e5b7673e2e73942f36ffa9f4a252912bd20e1f7c7727ad38a36d09db138f
MD5 3bc8c141eb11b2e92b68787be2c3f958
BLAKE2b-256 b73306576f2899e1040d087dba6cd83aff6d216052378d5048faf3b0ad91ee19

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5126a52a5fbc5b85a1ddad534a0e07196856d84b23b5fe5bacddfb83941a37e1
MD5 e1d46ce48e4d7ddbc5b11d890a01c426
BLAKE2b-256 9e6c1cb5a128ad0fbabfe89f38326c2808ce16333df4f1719c6fcdee3e1f2c4f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d038163ea3d7184b11888c7e637bc5638a044f99b5247d0aa8a67cdcb31aedcd
MD5 0a9cfd69ebb37c840b9b3f6a69d7db66
BLAKE2b-256 ecf6f3d0501d17a8280a8b34d1939c7e662b004febce2c83d7970a6b324d6fc3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b2328f13646ad47a1a807375d90c5ce54d9922b4efa58a2becbde8a031af4ff7
MD5 ba9a5633b3e8f4cb0ae1f71076c67bd2
BLAKE2b-256 ef7ee8c7c360344b832e0c3b7b32f7950b6f9e9db70fe740592ccdcb053171cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 722302a34cb7d4240a8dd5ed3168bdb1795f4abc8315a0e5213f99a0bca550d5
MD5 ff240a8339f9d8639d1cd63d009739b2
BLAKE2b-256 c79713cd42ca7ddb1ddbba7afcdd07159c19099e048b4d5062b8cd78e101cb06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ea6246bd04ac860b380396c38aa835e12cf8072fafb14cbaa1635106fc37c4b9
MD5 39620dfdb72f3514ef39e4839aef3c71
BLAKE2b-256 4a6444d0567ae1f7400334b518d9b6b1462973994b1cb3035ff019b265998791

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d9cfdf3c3b36b148a3665119024b9128ca4bc500423e1e7232c2a42cd6f1b49c
MD5 5acca714354825de50eee261a0246350
BLAKE2b-256 7aa5324f1dcd7ccbe94eaddfa6e9edfe26fac6c2ab4c29f1003b5d00d92cebd1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7c690143f23740e7e41634471bf31af4ebc419943fef1d6f892d4bd7789b8883
MD5 f6e0d51753e20c60521e7ab847154138
BLAKE2b-256 4ba258131aa76df4d91ad7d5383acf2e9dc2bdadcbc1ecaec9a63797a7b08c76

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 59367def1299d054914f53c690686ed80ed5fd0776618deaffc1b9d9f5d1d400
MD5 de8958acdd1ffd54f5325a2c61243fd3
BLAKE2b-256 8d45a4c9360c8c355f61bee6b669d44b50b34af8a871916b9eb0c1f2f5115646

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0b8981b5ce0b9521d1eb725a247dd903440dcd80ac0681df357b57e23b26b63d
MD5 d804a7fe5de255cc5063132bc9f97514
BLAKE2b-256 0d5fec73ee6139213fba80f1ede798047fe44a98d0fc0ec5df06b86c9304fd8e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 48ed46ac3f547864fbd0974fa94c07bad14a007dff0287ab7ae5b78177b30b1b
MD5 dda65fe082f96d28696ee8ddb930f200
BLAKE2b-256 1049673fa7942f277c0edfcbbb0aa10369e2c53f4e816c3de3e2ee3ebfad5ba5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8be5f1321ede538bcc7dcf473f4add49072033a098c0a687abb65810b3a4900c
MD5 9569b1f6a1a1bd70563a1906b5e54465
BLAKE2b-256 5a7936d1faedade307ac0ed881e8b714b7d691563ef0407e568dd34b41fc8c48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7d8c538a0c70efe08d48e449b2c9aa7f8ddd975113729ebb69b09d8c2867c411
MD5 3a0fd62ff2a80536866ffa07d1cec535
BLAKE2b-256 0e97d9ec96420fb4b4906c922eee242b42b83c27e216f694f6d7a545a9086706

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5713ebf22182a65ef33280476731eb6ecbe30c3501c18da10c1d16a3bdc0ac3a
MD5 f8a4db5fca015818f718e9ea44a44369
BLAKE2b-256 7c7042079e065c4a76244fde2150a01ea85ce69c5ca3f11c1692ee59825fcefe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.2.1-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f07ff7b6d24080e2f1f8c737fe7c804bc2e478f29f406e39873fc5764bf95bda
MD5 ee7c1f10852012c38a265f967a519f78
BLAKE2b-256 641ae492eb54e66bb559faedd1cea78d9b25bca24fdb7131b8bde21636ebbb3a

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