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
)

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

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

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

usearch-0.1.10-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (124.6 kB view details)

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

usearch-0.1.10-cp311-cp311-macosx_11_0_arm64.whl (116.9 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

usearch-0.1.10-cp311-cp311-macosx_10_9_x86_64.whl (128.9 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

usearch-0.1.10-cp311-cp311-macosx_10_9_universal2.whl (234.2 kB view details)

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

usearch-0.1.10-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (132.3 kB view details)

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

usearch-0.1.10-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (124.6 kB view details)

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

usearch-0.1.10-cp310-cp310-macosx_11_0_arm64.whl (116.9 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

usearch-0.1.10-cp310-cp310-macosx_10_9_x86_64.whl (128.9 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

usearch-0.1.10-cp310-cp310-macosx_10_9_universal2.whl (234.3 kB view details)

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

usearch-0.1.10-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (132.4 kB view details)

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

usearch-0.1.10-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (125.1 kB view details)

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

usearch-0.1.10-cp39-cp39-macosx_11_0_arm64.whl (117.2 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

usearch-0.1.10-cp39-cp39-macosx_10_9_x86_64.whl (129.1 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

usearch-0.1.10-cp39-cp39-macosx_10_9_universal2.whl (234.8 kB view details)

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

usearch-0.1.10-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (132.0 kB view details)

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

usearch-0.1.10-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (124.7 kB view details)

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

usearch-0.1.10-cp38-cp38-macosx_11_0_arm64.whl (116.8 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

usearch-0.1.10-cp38-cp38-macosx_10_9_x86_64.whl (128.8 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

usearch-0.1.10-cp38-cp38-macosx_10_9_universal2.whl (234.1 kB view details)

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

usearch-0.1.10-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (136.1 kB view details)

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

usearch-0.1.10-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (127.8 kB view details)

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

usearch-0.1.10-cp37-cp37m-macosx_10_9_x86_64.whl (128.4 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

usearch-0.1.10-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (135.9 kB view details)

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

usearch-0.1.10-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (127.7 kB view details)

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

usearch-0.1.10-cp36-cp36m-macosx_10_9_x86_64.whl (128.4 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cf33cc53e4170751aa039bd12c5cead28345f3157609b9c9e2fdd45a18aa9e66
MD5 313b674515a727c0e2d204c456d0ebb5
BLAKE2b-256 d509504355f7ec4700b7a3c174047f1ef077274d0e5db15c06110ec6c7f5aa91

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 656337513f78f53c87abb10d5080919fa13f0f245f08cfada85e9eb742532490
MD5 e59c3159e8bbd7ff23ecb78e8a187f15
BLAKE2b-256 562ff6d9678f2a55d807e49379c4a090ee5293a9dc72d015ddf9bdafee22dbbc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 48fa6cbfc43e62d2d9851e46e5473f194e8df6456d74c219fa5d0142851dde21
MD5 620b1862e2e819307ffe834254b920f8
BLAKE2b-256 fa7baed1016f06e158a588c4e8af9df1f477821b2d0a3a107e51b629b28e1e14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ddd2bab86212949f3273b8e17e2e5ad546075b08eaa81c996b00240373f61a4f
MD5 5082a6c99f92d3a4b13300a91f8ddbfc
BLAKE2b-256 77dec4702dff96a0546b95a116296a16e8245cfa14cb19178305f5e4c286a46d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 355d8dca0182ea5f03a72961231bcc539d15651a725a0c2db6f051bf2793f48a
MD5 dd55eee476426df775345fa63cc95e00
BLAKE2b-256 df3b52d3191891b821c0bfd5e7f289126bfb9a5fa0b611b1cb11787633b7beaa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a2c9a4da8dc258dd027c588500b3c505bfb511370987692a30c8523edef73b1c
MD5 3c3dab1e764d4978f2c7caa5c3bcc904
BLAKE2b-256 55f6d75d81604bff2bab37d28e191138762c5efb737d17ae1c5dc0001763d628

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9930ce967bcfafca52e2b2ab80c09bd8a98b5a6fbee587e7c92b9da53311bc79
MD5 f887e899443d46d34b79e827a163274e
BLAKE2b-256 d80fa9bcdf3db89f28f1707f7a2551f3f51faa47522a18599e8ed85168fe37a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3f8648a84c92de3570efbc227fafdf308aacd3ddffd740f85d00ed0f65b73d24
MD5 7e520e1eb4ae13e6e4c71a63661fca11
BLAKE2b-256 d8e98316fab37dbb3ae4a1238b81e598cd3dd3824fdfe2db29868b8f58397afa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3b74b90909ac674fd341b3c943201b32d97c6417c90178d23c83fb44fc81cd1b
MD5 fec6e2e7e915f381cee377d4eb9cd58c
BLAKE2b-256 55e157e6b92569501c059f6b28d6a6cf1c978c8203ab2bc8163527157425aef1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 5e5700aa662378b75528fd2d34cddd46214de94e1af89ff7c9674cb863bbf73a
MD5 d901ea78fddcfd3788b95bbae460d6ea
BLAKE2b-256 04469d6c43d5fd5a1cc2b49db69058f7da7efb98089474d5ebb47141d3692c6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8926a06a034ea120dd276cc3c865040225f7bf4e72d60b7f6fa5fe138f57996
MD5 1d7ca725b7ca36889896e487f3a67da3
BLAKE2b-256 ac910b19ba4f2655358869525c1cafb2cbda53bf2cac6e071d3fd69b45b45cde

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0e72d8792f60d038bb820452e1fb4b0e7ea8ff0945c2260382072b64425830bf
MD5 ccd02f51e6a8d2746b4f54ce684d0441
BLAKE2b-256 328b6577d4bbd64d4ffc3c70bcce5d08fb3ebf3caa989d356ea121fcf5549034

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 47a47f0cc6913ff47135ec209168d0196f64b448855edce54ca5197f01d86c7e
MD5 7f0a010f940bf817cf8ad2005c752c57
BLAKE2b-256 8d8b40a5e723cc09d4ad6cb7959343a7e54b807bbcbd146d38ca26d597c6ebe1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 36826bc9758275d82b42f34540bf0945ce0fa96032163845f7670a619170bbca
MD5 318a8eb08b332928edaf94703b903fa6
BLAKE2b-256 5e426d94f513743981780a65609f447d5a5e0fbd28409a9336e97ebd32d081d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a633c03be992631eafcc6f35c10076ff354c10bf26320cdeb72964972b34a1e8
MD5 8fb039f9ec91936484d69da0de2a787d
BLAKE2b-256 6554e9ff08b42e4bbbea147d9b4beb8a9a01714169fb6b0e63cb34ec6b954227

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1e261ccb8146c7700da159ef7e9c4021e58bae43c65ad37def7ded5c8bdef80b
MD5 23848d3fde42bdd7594e4a206a9d280f
BLAKE2b-256 48c50630c109f630aad8819ffc56138310a99e5bd75969d51f67fcfede060b83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8e59bd221b8b4a6e106d3174efdb5a22d3c5a08c0ab76ee2170d8a04c4b7af6c
MD5 11663468fc60bde34f882facbd24de78
BLAKE2b-256 9233d9c5462446d69ea679d8a7a726982dcd439627355b345e3a0c81d01409a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 10240dd2823a6a99be6f06029586779d7dd37a1ecec1a9e4878c6dcb759b2522
MD5 584632a35d75e55e04529c8a81596ba2
BLAKE2b-256 6550dd4d9cea4f3a5d1a9abbf9a5e171cb2845b566d5765d919ac442cf497ab5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 601547f0b5b7e9516cf9c1460c1b71f334c9f8930a83866e41a36b9eaa7afdd4
MD5 3487d9fad740117ef9eaee367afbf0fa
BLAKE2b-256 806ef32f26eb14a8ff06197d23f61501b9c8d90c52271ee7acaebc6fea0efc54

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 8f36f460d88a6a14b4e5a858e468902b6527e8b3e9886d7fd075ea0d96f17615
MD5 8663412534f43b6f019210a0fa5ec9cc
BLAKE2b-256 89c5a1e5442c548ac7a4615f6833656d4f19181c573b2acb660f188b3090fb07

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 35fa1daaefcd6c69d40dafcb37a9ea85b4f45f19bba9548c57849167112c9518
MD5 61b7c19f4a7ee67d368a2ae42474cba3
BLAKE2b-256 ee995dd768a14497e127802f40c815175a9562507af55a680192dec407c796a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp37-cp37m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a6c288166215895e8c500378c1dad5358a2092dd347c60b7a33a5aeaa9524ed0
MD5 6075a83b379cf3b7e56a7fbc87a67e08
BLAKE2b-256 16003ac083ea52a0df587943048534215b77efd2ef98d5c1c136abf085a869fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8539051e69c51693697701b207c17ee25ae1bfa7becc54135e8998ed07f19f6d
MD5 72f0030e5685ab1f1fd3ecdab8d1ec93
BLAKE2b-256 b8899c4909462ec4aaced0124481eb7a56606f8cd7e54e0e7297017b2c257352

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp36-cp36m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 18da07c1e602a7bc2a05cf51eceef8b4a3922b3054de01a7d8dc6bf16b34b9ba
MD5 e17d6cb90aadc7c4da4d7c9fe5818855
BLAKE2b-256 9c96bcfee45a88c0221d037206031c51e55ed30e439a33671c071a9b63ea109d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp36-cp36m-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6640db5a5d0b50bf6b9a2ae9e3340c29ec21181c45549add9299a664f6205420
MD5 b768415c8be37aeca056c6653065bc19
BLAKE2b-256 128d4ef5372c69c3d0867149de63eddfec2fe0daa1f3b63e957deaa9bb0c317c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.1.10-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b190ac4ffd3f6bc5e35057a012a0300488c815c3f45e57a958422962410f7f7a
MD5 8b5e390413b84ca98049f377266c7270
BLAKE2b-256 e326b940ef3525b99084c576ae73f268c968b466672461a77f5dbb39bcc77519

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