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

Euclidean • Angular • Jaccard • Hamming • Haversine • User-Defined Metrics
C++11PythonJavaScriptJavaRustObjective-CSwiftGoLangWolfram
Linux • MacOS • Windows



FAISS USearch
Implementation 84 K SLOC in faiss/ 1 K SLOC in usearch/
Supported metrics 9 fixed metrics Any User-Defined metrics
Supported ID types uint32_t, uint64_t uint32_t, uint40_t, uint64_t
Dependencies BLAS, OpenMP None
Bindings SWIG Native
Acceleration Learned Quantization Downcasting

FAISS is the industry standard for a high-performance batteries-included vector search engine. Both USearch and FAISS implement the same HNSW algorithm. But they differ in a lot of design decisions. USearch is designed to be compact and broadly compatible without sacrificing performance.

FAISS, f32 USearch, f32 USearch, f16 USearch, f8
Insertions 76 K/s 105 K/s 115 K/s 202 K/s
Queries 118 K/s 174 K/s 173 K/s 304 K/s
Recall @1 99% 99.2% 99.1% 99.2%

Dataset: 1M vectors sample of the Deep1B dataset. Hardware: c7g.metal AWS instance with 64 cores and DDR5 memory. HNSW was configured with identical hyper-parameters: connectivity M=16, expansion @ construction efConstruction=128, and expansion @ search ef=64. Both libraries were compiled for the target architecture. Jump to the Performance Tuning section to read about the effects of those hyper-parameters.

User-Defined Functions

Most vector-search packages focus on just 2 metrics - "Inner Product distance" and "Euclidean distance". That only partially exhausts the list of possible metrics. A good example would be the rare Haversine distance, used to compute the distance between geo-spatial coordinates, extending Vector Search into the GIS domain. Another example would be designing a custom metric for composite embeddings concatenated from multiple AI models in real-world applications. USearch supports that: Python and C++ examples.

USearch: Vector Search Approaches

Unlike older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing, HNSW doesn't require vectors to be identical in length. They only have to be comparable. So you can apply it in obscure applications, like searching for similar sets or fuzzy text matching.

Memory Efficiency, Downcasting, and Quantization

Training a quantization model and dimension-reduction is a common approach to accelerate vector search. Those, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts.

USearch uint40_t support

Instead, we have focused on high-precision arithmetic over low-precision downcasted vectors. The same index, and add and search operations will automatically down-cast or up-cast between f32_t, f16_t, f64_t, and f8_t representations, even if the hardware doesn't natively support it. Continuing the topic of memory-efficiency, we provide a uint40_t to allow collection with over 4B+ vectors without allocating 8 bytes for every neighbor reference in the proximity graph.

View Larger Indexes from Disk

Modern search systems often suggest using different servers to maximize indexing speed and minimize serving costs. Memory-optimized for the first task, and storage-optimized for the second, if the index can be served from external memory, which USearch can.

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

There is a 50x difference between the cost of such instances for identical capacity. Of course, the latency of external memory access will be higher, but it is in part compensated with an excellent prefetching mechanism.

Usage

There are two usage patters:

  1. Bare-bones with usearch/usearch.hpp, only available in C++.
  2. 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++

Installation

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)

Quickstart

Once included, the low-level C++11 interface is as simple as it gets: reserve(), add(), search(), size(), capacity(), save(), load(), view(). This covers 90% of use-cases.

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[0], 3});
auto results = index.search(/* query: */ {&vec[0], 3}, 5 /* neighbors */);

for (std::size_t i = 0; i != results.size(); ++i)
    results[i].member.label, results[i].member.vector, results[i].distance;

The add is thread-safe for concurrent index construction.

Serialization

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

User-Defined Metrics in C++

For advanced users, more compile-time abstractions 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;

You may want to use a custom memory allocator or a rare scalar type, but most often, you would start by defining a custom similarity measure. The function object should have the following signature to support different-length vectors.

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

The following distances are pre-packaged:

  • cos_gt<scalar_t> for "Cosine" or "Angular" distance.
  • ip_gt<scalar_t> for "Inner Product" or "Dot Product" distance.
  • l2sq_gt<scalar_t> for the squared "L2" or "Euclidean" distance.
  • jaccard_gt<scalar_t> for "Jaccard" distance between two ordered sets of unique elements.
  • bitwise_hamming_gt<scalar_t> for "Hamming" distance, as the number of shared bits in hashes.
  • bitwise_tanimoto_gt<scalar_t> for "Tanimoto" coefficient for bit-strings.
  • bitwise_sorensen_gt<scalar_t> for "Dice-Sorensen" coefficient for bit-strings.
  • pearson_correlation_gt<scalar_t> for "Pearson" correlation between probability distributions.
  • haversine_gt<scalar_t> for "Haversine" or "Great Circle" distance between coordinates used in GIS applications.

Multi-Threading

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

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

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

Python

Installation

pip install usearch

Quickstart

import numpy as np
from usearch.index import Index

index = Index(
    ndim=3, # Define the number of dimensions in input vectors
    metric='cos', # Choose 'l2sq', 'haversine' or other metric, default = 'ip'
    dtype='f32', # Quantize to 'f16' or 'f8' if needed, default = 'f32'
    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.array([0.2, 0.6, 0.4], dtype=np.float32)
index.add(42, vector)
matches, distances, count = index.search(vector, 10)

assert len(index) == 1
assert count == 1
assert matches[0] == 42
assert distances[0] <= 0.001

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

Serialization

index.save('index.usearch')
index.load('index.usearch') # Copy the whole index into memory
index.view('index.usearch') # View from disk without loading in memory

Batch Operations

Adding or querying a batch of entries is identical to adding a single vector. The difference would be in the shape of the tensors.

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

index.add(labels, vectors, threads=..., copy=...)
matches, distances, counts = index.search(vectors, 10, threads=...)

assert matches.shape[0] == vectors.shape[0]
assert counts[0] <= 10

You can also override the default threads and copy arguments in bulk workloads. The first controls the number of threads spawned for the task. The second controls whether the vector itself will be persisted inside the index. If you can preserve the lifetime of the vector somewhere else, you can avoid the copy.

User-Defined Metrics in Python

Assuming the language boundary exists between Python user code and C++ implementation, there are more efficient solutions than passing a Python callable to the engine. Luckily, with the help of Numba, we can JIT compile a function with a matching signature and pass it down to the engine.

from numba import cfunc, types, carray

signature = types.float32(
    types.CPointer(types.float32),
    types.CPointer(types.float32),
    types.uint64, types.uint64)

@cfunc(signature)
def python_dot(a, b, n, m):
    a_array = carray(a, n)
    b_array = carray(b, n)
    c = 0.0
    for i in range(n):
        c += a_array[i] * b_array[i]
    return c

index = Index(ndim=ndim, metric=python_dot.address)

To use Numba JIT, install USearch with extras:

pip install usearch[jit]

Tooling

from usearch.index import Index
from usearch.io import load_matrix, save_matrix

vectors = load_matrix('deep1B.fbin')
index = Index(ndim=vectors.shape[1])
index.add(labels, vectors)

JavaScript

Installation

npm install usearch

Quickstart

var index = new usearch.Index({ metric: 'cos', connectivity: 16, dimensions: 3 })
index.add(42, new Float32Array([0.2, 0.6, 0.4]))
var results = index.search(new Float32Array([0.2, 0.6, 0.4]), 10)

assert.equal(index.size(), 1)
assert.deepEqual(results.labels, new Uint32Array([42]))
assert.deepEqual(results.distances, new Float32Array([0]))

Serialization

index.save('index.usearch')
index.load('index.usearch')
index.view('index.usearch')

Rust

Installation

cargo add usearch

Quickstart

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

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

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

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

Multi-Threading

assert!(index.add_in_thread(42, &first, 0).is_ok());
assert!(index.add_in_thread(43, &second, 0).is_ok());
let results = index.search_in_thread(&first, 10, 0).unwrap();

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

Serialization

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

Metrics

assert!(new_l2sq(3, &quant, 0, 0, 0).is_ok());
assert!(new_cos(3, &quant, 0, 0, 0).is_ok());
assert!(new_haversine(&quant, 0, 0, 0).is_ok());

Java

Installation

<dependency>
  <groupId>cloud.unum</groupId>
  <artifactId>usearch</artifactId>
  <version>0.2.3</version>
</dependency>

Add that snippet to your pom.xml and hit mvn install.

Quickstart

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

Swift

Installation

https://github.com/unum-cloud/usearch

Quickstart

let index = Index.l2sq(dimensions: 3, connectivity: 8)
let vectorA: [Float32] = [0.3, 0.5, 1.2]
let vectorB: [Float32] = [0.4, 0.2, 1.2]
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

Installation

import (
	"github.com/unum-cloud/usearch/golang"
)

Quickstart

package main

import (
	"fmt"
	"github.com/unum-cloud/usearch/golang"
)

func main() {
	conf := usearch.DefaultConfig(128)
	index := usearch.NewIndex(conf)
	v := make([]float32, 128)
	index.Add(42, v)
	results := index.Search(v, 1)
}

Wolfram

TODO

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

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
from usearch.index import Index

import numpy as np
from PIL import Image

server = ucall.Server()
model = uform.get_model('unum-cloud/uform-vl-multilingual')
index = 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.12.2-cp311-cp311-win_amd64.whl (157.2 kB view details)

Uploaded CPython 3.11 Windows x86-64

usearch-0.12.2-cp311-cp311-manylinux_2_28_x86_64.whl (314.9 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ x86-64

usearch-0.12.2-cp311-cp311-manylinux_2_28_aarch64.whl (303.9 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ ARM64

usearch-0.12.2-cp311-cp311-macosx_11_0_arm64.whl (196.9 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

usearch-0.12.2-cp311-cp311-macosx_10_9_x86_64.whl (210.2 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

usearch-0.12.2-cp311-cp311-macosx_10_9_universal2.whl (387.2 kB view details)

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

usearch-0.12.2-cp310-cp310-win_amd64.whl (157.2 kB view details)

Uploaded CPython 3.10 Windows x86-64

usearch-0.12.2-cp310-cp310-manylinux_2_28_x86_64.whl (314.8 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ x86-64

usearch-0.12.2-cp310-cp310-manylinux_2_28_aarch64.whl (304.0 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ ARM64

usearch-0.12.2-cp310-cp310-macosx_11_0_arm64.whl (196.9 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

usearch-0.12.2-cp310-cp310-macosx_10_9_x86_64.whl (210.2 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

usearch-0.12.2-cp310-cp310-macosx_10_9_universal2.whl (387.2 kB view details)

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

usearch-0.12.2-cp39-cp39-win_amd64.whl (157.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

usearch-0.12.2-cp39-cp39-manylinux_2_28_x86_64.whl (314.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ x86-64

usearch-0.12.2-cp39-cp39-manylinux_2_28_aarch64.whl (303.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ ARM64

usearch-0.12.2-cp39-cp39-macosx_11_0_arm64.whl (197.0 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

usearch-0.12.2-cp39-cp39-macosx_10_9_x86_64.whl (210.4 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

usearch-0.12.2-cp39-cp39-macosx_10_9_universal2.whl (387.5 kB view details)

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

usearch-0.12.2-cp38-cp38-win_amd64.whl (157.0 kB view details)

Uploaded CPython 3.8 Windows x86-64

usearch-0.12.2-cp38-cp38-manylinux_2_28_x86_64.whl (314.3 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.28+ x86-64

usearch-0.12.2-cp38-cp38-manylinux_2_28_aarch64.whl (303.7 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.28+ ARM64

usearch-0.12.2-cp38-cp38-macosx_11_0_arm64.whl (196.8 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

usearch-0.12.2-cp38-cp38-macosx_10_9_x86_64.whl (210.2 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

usearch-0.12.2-cp38-cp38-macosx_10_9_universal2.whl (387.1 kB view details)

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

usearch-0.12.2-cp37-cp37m-win_amd64.whl (157.1 kB view details)

Uploaded CPython 3.7m Windows x86-64

usearch-0.12.2-cp37-cp37m-manylinux_2_28_x86_64.whl (318.2 kB view details)

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

usearch-0.12.2-cp37-cp37m-manylinux_2_28_aarch64.whl (308.1 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.28+ ARM64

usearch-0.12.2-cp37-cp37m-macosx_10_9_x86_64.whl (207.8 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

usearch-0.12.2-cp36-cp36m-win_amd64.whl (157.0 kB view details)

Uploaded CPython 3.6m Windows x86-64

usearch-0.12.2-cp36-cp36m-manylinux_2_28_x86_64.whl (318.1 kB view details)

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

usearch-0.12.2-cp36-cp36m-manylinux_2_28_aarch64.whl (308.2 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.28+ ARM64

usearch-0.12.2-cp36-cp36m-macosx_10_9_x86_64.whl (207.9 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

Details for the file usearch-0.12.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: usearch-0.12.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 157.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for usearch-0.12.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3032a5dc28128a15880461205e71635f349a85e16507649f754914b6d19c326c
MD5 d6a76925f777558cf6d9538753bff2f3
BLAKE2b-256 2ddf4923711d67dd60831fae25198e5da1d08470b913473574952266037ee9a7

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fde4a371daa5baf12e42341d651940ff7c929ba4fe63c7b501695047f59a5b9c
MD5 8ef35d3081af941a031385e714f32521
BLAKE2b-256 50ae8b9739f3e5fe60f74104f2cff3fafaa15d8843f7d55fa60367494b564080

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4dfcae4eacd8f5a7c06d1b183f75c2e5674235f6023a92a55f2517d5cf74c74c
MD5 3675d77843f033e7b56cac210ac8b765
BLAKE2b-256 80f347e27620dd025f59d449d50fff76206ab7094c81d2b854fa4d1f0ca44746

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7731458a3c86f6393b55af512552c750dd1f1dd95fc64994f8a3529586e5252d
MD5 fc0b84c9557f32cbc3dc958d41475b33
BLAKE2b-256 599010023c13a69de2da499cd31777c78f30aa116cc00dc11ccc74e1d1c7a1e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b791d23cec6941ec1205b658315d5606b114f7652cb812df329e5594e922970a
MD5 682f8136548ef6afbeb1a0f45e110c81
BLAKE2b-256 f0d5b347a78b7354e9ce09b71caa368dca8341a2cfe3135ef892918e81954307

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a2b507d0dc56c83da09787912ade7a15f0d7648c13639711c96ff259d8796c34
MD5 a928330e56610c5b4c3712e83efe9e01
BLAKE2b-256 efeedcf5622baaa5eda6de12cfe4db2d1d88ece1160968ba64a0ef52c93969b7

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: usearch-0.12.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 157.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for usearch-0.12.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4af643ab96d61e689b9d4a1d28a60b1f0db184088abfd24c62ab8735a8f2f1ef
MD5 9e4a75a798dd6a426ba5446a3ae5d11d
BLAKE2b-256 d4bc2d4acdf39d10a770a1604a1caad3cd084a9ff70ab28dc021fdde7b5d7557

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b5ea2d413b534d76374e4f34a00202c98d1d283e5e7498cb30280be15d887158
MD5 0da6a3f8591ebeae9ddf35c0b89c5cd2
BLAKE2b-256 b120c20ba8fe39d1f6baf05a00104cf1bc0d8d3da384271e846c2a6b8dc5df06

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5a0c8ba50378dcd73c6913e6365a801c6e8d29b012f2c1749a0962f5662a6c9f
MD5 6066cc4993f402bffcd6fa5476850e59
BLAKE2b-256 aa495da8462a079611a5d13b7df069cae0b00dc1381b7dcf7ff9e9c031eb3a12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 791bc419c1a06bba4bcd0e24056bdd8bf69d69ed393bfe63e44f79b4089fa62b
MD5 ab5a1e7868594c6e09aeafcd836b5fa1
BLAKE2b-256 f9026d48e5348991f3e1445488dfb7d16c4e2c74271980b88384c0ab0e8b7236

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 04e7d8e21291d887ab5253d2cc37f37e78ba0b67509f5f1d83910cac3985087b
MD5 23dd5cdfb756f72b14512292d9ed5c64
BLAKE2b-256 747f6cd56fc05c14030801106e47576ddab8de7371d21c7ee67d002b77a71cf7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 709617f811d3a868458d3b26eceeb68eb38fe98bd8c04ee4b4bf4db3f59270dc
MD5 baea119f941c8a25e1a646205268c4c8
BLAKE2b-256 850338487c96be20e1a1eb4eba3204edd29413cfc1721be5922b1b64188ef062

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: usearch-0.12.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 157.3 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for usearch-0.12.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 20a2c9c0656271665789d6774398e9bac934ff4f415a9d9978d561b23664c700
MD5 2f17c0501075de27ddd42cd6802b94e7
BLAKE2b-256 f04a5e6ae0d0da25977e605b451f7445d537df97bccb54df8daea66cf960e3c1

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2e3284b09ad14531f37cfc2e89c49024be8d223cbb49f5ca5fb00a3460208ba7
MD5 ba2df3e454903f251dc0ecf58481d68a
BLAKE2b-256 04d7d617f02e88fdd578c8868805a920c9e1494e2e659f26971c866098e3264b

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0e45c89f2fc62781f6ce5cfc39e16d524627181d0eacea4cde28a5e82ebeafff
MD5 e6db0a704cbbc721112f4479316041ed
BLAKE2b-256 eda70266e62f62df29df613d4c14a879626f350e4e3345e78b332dc338028583

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 48c59be00ec1718f3273f6e283d42c262cf6ed8a84782fd2a13b40c707f209db
MD5 6d77670579b42b471bda579bb725d3f0
BLAKE2b-256 d908fcad4fd0559d6bcd555744613e1d307e938035eab3b079f1d40b574e903f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 07a620250f025f9575187563bf788fa8d71b3707b792a59ddafaab7e0764ec4c
MD5 813a5dfa369977b17160c1c664a83a42
BLAKE2b-256 051788b87aa8110b38450e19a4ab3e4f277197cc2fccacb819597f77fcfcc157

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 2d03b11016f1588a3e7d6c9e7368b9263c18db3b37955ce21797766b4d8f53d7
MD5 0a0da114ea3ca3587c719ac6c42c96aa
BLAKE2b-256 aaa781f84a9d8409a48d799d103ee0309db3884adbfc702883f69da894c4a862

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: usearch-0.12.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 157.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for usearch-0.12.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 40a80d1f24472ee3a0cf1edb0bd688ab485d8c8c13eae0b118ef059206ed067d
MD5 97216c6a357510143f256056919618f5
BLAKE2b-256 c03f41ffbfa401a0310a2577e77c43abcc199e9bfe2151b6088a959011f1941e

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp38-cp38-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6703ba9424957be4ad5f579578e7f4fa085eac587dcce17de7bdc44d9c6f5d20
MD5 a132fbe8abe1d5b4ec3e3d9c93c9078e
BLAKE2b-256 78843027e3a05d1a56ca49f1021f571e4bdfcb8621de0e1a894a6417779cb296

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp38-cp38-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 659df55a01bfd20dd8dea30c1e4e9527b157914dc775d0337086461dfeb9a40d
MD5 558f0f153371f239c3137f0727ea8733
BLAKE2b-256 de10eab78de2b29c186044be4f3afae650b34128ce99062058db180aea9e57e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eaf89d603f535799998a0d4fe465ba97560f8adb826cb69559b7c41c2d996854
MD5 8a87c82a67e2fb9ce0d030699bd6c1be
BLAKE2b-256 412be28018ba9987780b1f2f960f0d1e53ea6bef12378a0ea52b9e7e6792a5ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 028f99d7b73f2b1b0907454df3df03fbbb24d1bd90b07156604366e0e8a3143b
MD5 a6287cdcc69d4d576d5a10045bb0f9b1
BLAKE2b-256 d7f27f9e1ee8ed4925819787ff64fee18f887c835dd480667a22a85b0d1e72b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d6c11bc480e4cb6a0de484bcb9d527e45186ffc6da44a9e32e37f1ef635a3bdf
MD5 b343884d9c0f29e3dad3594184764693
BLAKE2b-256 a4035acae7ea54f41b9dcaae54421fcd5c9de889b4d6d30ee9acc636df49ae3e

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: usearch-0.12.2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 157.1 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for usearch-0.12.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 7f61e8f79568c95dff56b4b761eb7032f2fe40fa35ea95ebd5283c448ad49980
MD5 fde0fbe7f2db15a43d3876e768dbf790
BLAKE2b-256 ac827382ae4aea7ca076a6099f9d990fb3b1a0f855c56bd493723011b8128b9d

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp37-cp37m-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp37-cp37m-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 03832bcb0cab2109143747e95c12fb37dfb0cc1966f03492513ed1e486ef9c5a
MD5 f1a98ed9cbbc0bce2fe392e2fb2c911a
BLAKE2b-256 2e563c044330da57499162374625f69e7a6731199902bce6304b5ceb9b915342

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp37-cp37m-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp37-cp37m-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c44a4d5f8dff5b7130c29ee089b89e534db69ebe285c4168cacd8bf65a701b7f
MD5 608aca019243675e5f2c7bcff801e127
BLAKE2b-256 a2d3471e752dde1cd5fa24d67cda3f0344147199e3095ab655feb669de65cb12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7616ec7cffc4bfe3aa55b4bf162412ba09e798f1c4e3e4fc5fa1f2079af63661
MD5 a7afcacb4986a03a408edb6123dc48d0
BLAKE2b-256 09d726ae95d484fac5017245c1fdf57f5197bf3c58375fb754945f5b0b39402c

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: usearch-0.12.2-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 157.0 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for usearch-0.12.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 9de8329cfa4fb9a2bd80a5dbf9f5264e4f7e40c488d3b94d331af2dfbc4d8321
MD5 2e0ad406407e8690666bf66c4af2bec0
BLAKE2b-256 97d3e86481b205d1949561a1dddcee5350bace5d5d5d426cf99b6e486dcfed83

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp36-cp36m-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp36-cp36m-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 550b142dd587dd345ac52989bb72de834cdf1a024a7778beffac802136e04fac
MD5 afed2d1f92bdf4c0e520de895e454a7c
BLAKE2b-256 d88412687622aa1bd46a7ae91cbfaab53c8b78cbfe8f10c36d194dd32d3c64e9

See more details on using hashes here.

File details

Details for the file usearch-0.12.2-cp36-cp36m-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for usearch-0.12.2-cp36-cp36m-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ca7e3ec2f39cc5c2c4984c1bb1e53135f58e5cbc243d5803bd8620ac1ddcb194
MD5 133308f2af939d0ee7f8351d1c0b2027
BLAKE2b-256 b36486e9819d6905cf334190ea7e5a427a69fd0cb1a745e50dd60cde8d2ddfbb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.12.2-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4110e802ce9ca344358be66ba2cfc3017dd2fce34591f6a8010887fe6225cd84
MD5 9797d12f7721039b6a104214d5663e71
BLAKE2b-256 d7b9c593f3bd7e77c991b813e1eaf0ad4fd3ed362c5da6e34a910325925aa431

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