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 • Docker • WebAssembly 🔜



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
Batch Insert 16 K/s 73 K/s 100 K/s 104 K/s
Batch Search 82 K/s 103 K/s 113 K/s 134 K/s
Bulk Insert 76 K/s 105 K/s 115 K/s 202 K/s
Bulk Search 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. Batch size is 256. 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/index.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/index.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].element.label, results[i].element.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.
  • hamming_gt<scalar_t> for "Hamming" distance, as the number of shared bits in hashes.
  • tanimoto_gt<scalar_t> for "Tanimoto" coefficient for bit-strings.
  • 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.arange(n)
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

ndim = 256
signature = types.float32(
    types.CPointer(types.float32),
    types.CPointer(types.float32))

@cfunc(signature)
def python_dot(a, b):
    a_array = carray(a, ndim)
    b_array = carray(b, ndim)
    c = 0.0
    for i in range(ndim):
        c += a_array[i] * b_array[i]
    return 1 - 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 options = IndexOptions {
            dimensions: 5,
            metric: MetricKind::IP,
            quantization: ScalarKind::F16,
            connectivity: 0,
            expansion_add: 0,
            expansion_search: 0
        };

let index = new_index(&options).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

Application Examples

USearch + AI = Multi-Modal 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 a text-to-image search platform in just 20 lines of Python.

import ucall
import uform
import usearch

import numpy as np
import PIL as pil

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

@server
def add(label: int, photo: pil.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()
    matches = index.search(vector.flatten(), 3)
    return matches.labels

server.run()

We have pre-processed some commonly used datasets, cleaning the images, producing the vectors, and pre-building the index.

Dataset Size Images Preprocessed
Unsplash 25K - 25 K HF
Unsplash 2M - 2 M HF
LAION 400M - 400 M HF
LAION 5B - 5 B HF

USearch + RDKit = Molecular Search

Comparing molecule graphs and searching for similar structures is expensive and slow. It can be seen as a special case of the NP-Complete Subgraph Isomorphism problem. Luckily, domain-specific approximate methods exists. The one commonly used in Chemistry, is to generate structures from SMILES, and later hash them into binary fingerprints. The later are searchable with bitwise similarity metrics, like the Tanimoto coefficient. Below is na example using the RDKit package.

from usearch.index import Index, MetricKind
from rdkit import Chem
from rdkit.Chem import AllChem

import numpy as np

molecules = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO')]
encoder = AllChem.GetRDKitFPGenerator()

fingerprints = np.vstack([encoder.GetFingerprint(x) for x in molecules])
fingerprints = np.packbits(fingerprints, axis=1)

index = Index(ndim=2048, metric=MetricKind.BitwiseTanimoto)
labels = np.arange(len(molecules))

index.add(labels, fingerprints)
matches = index.search(fingerprints, 10)

RDKit provides following fingerprinting techniques:

  • Atom-Pair,
  • Topological Torsion,
  • Morgan,
  • Layered Fingerprints.

We have preprocessed some of the most commonly used datasets, and made it available for free on the HuggingFace portal, together with visual interface.

Dataset Size Molecules Preprocessed
PubChem 8 GB 115'034'339 HF
GDB 13 2.3 GB 977'468'301 HF
REAL > 100 GB 6 B HF

TODO

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

Integrations

  • GPT-Cache.
  • Langchain.
  • Microsoft Semantic Kernel.
  • PyTorch.

Citations

@software{Vardanian_USearch_2022,
doi = {10.5281/zenodo.7949416},
author = {Vardanian, Ash},
title = {{USearch by Unum Cloud}},
url = {https://github.com/unum-cloud/usearch},
version = {0.13.0},
year = {2022}
month = jun,
}

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.18.8-cp311-cp311-win_amd64.whl (166.4 kB view details)

Uploaded CPython 3.11 Windows x86-64

usearch-0.18.8-cp311-cp311-manylinux_2_28_x86_64.whl (319.8 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ x86-64

usearch-0.18.8-cp311-cp311-manylinux_2_28_aarch64.whl (309.4 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ ARM64

usearch-0.18.8-cp311-cp311-macosx_11_0_arm64.whl (211.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

usearch-0.18.8-cp311-cp311-macosx_10_9_x86_64.whl (220.3 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

usearch-0.18.8-cp311-cp311-macosx_10_9_universal2.whl (405.9 kB view details)

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

usearch-0.18.8-cp310-cp310-win_amd64.whl (166.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

usearch-0.18.8-cp310-cp310-manylinux_2_28_x86_64.whl (319.7 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ x86-64

usearch-0.18.8-cp310-cp310-manylinux_2_28_aarch64.whl (309.5 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ ARM64

usearch-0.18.8-cp310-cp310-macosx_11_0_arm64.whl (211.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

usearch-0.18.8-cp310-cp310-macosx_10_9_x86_64.whl (220.4 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

usearch-0.18.8-cp310-cp310-macosx_10_9_universal2.whl (405.9 kB view details)

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

usearch-0.18.8-cp39-cp39-win_amd64.whl (166.4 kB view details)

Uploaded CPython 3.9 Windows x86-64

usearch-0.18.8-cp39-cp39-manylinux_2_28_x86_64.whl (320.0 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ x86-64

usearch-0.18.8-cp39-cp39-manylinux_2_28_aarch64.whl (309.5 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ ARM64

usearch-0.18.8-cp39-cp39-macosx_11_0_arm64.whl (211.5 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

usearch-0.18.8-cp39-cp39-macosx_10_9_x86_64.whl (220.5 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

usearch-0.18.8-cp39-cp39-macosx_10_9_universal2.whl (406.3 kB view details)

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

usearch-0.18.8-cp38-cp38-win_amd64.whl (166.2 kB view details)

Uploaded CPython 3.8 Windows x86-64

usearch-0.18.8-cp38-cp38-manylinux_2_28_x86_64.whl (319.6 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.28+ x86-64

usearch-0.18.8-cp38-cp38-manylinux_2_28_aarch64.whl (309.3 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.28+ ARM64

usearch-0.18.8-cp38-cp38-macosx_11_0_arm64.whl (211.3 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

usearch-0.18.8-cp38-cp38-macosx_10_9_x86_64.whl (220.3 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

usearch-0.18.8-cp38-cp38-macosx_10_9_universal2.whl (405.9 kB view details)

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

usearch-0.18.8-cp37-cp37m-win_amd64.whl (166.3 kB view details)

Uploaded CPython 3.7m Windows x86-64

usearch-0.18.8-cp37-cp37m-manylinux_2_28_x86_64.whl (324.4 kB view details)

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

usearch-0.18.8-cp37-cp37m-manylinux_2_28_aarch64.whl (314.5 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.28+ ARM64

usearch-0.18.8-cp37-cp37m-macosx_10_9_x86_64.whl (217.8 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for usearch-0.18.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0963f43e017f4b47e2bc76ca7114fb3baf72cd88c97c26e50833555073c359a8
MD5 da55e03b2bf9eaba642fbccc74f07802
BLAKE2b-256 a504095cc551593da865af28c131abe53033ca23e98607bb8f43c5303d1bfc49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 062cb2a8d5ef108ed9042e25c7d9566be2d60c6dae116234ad2e9002a3f684b9
MD5 ab7c606ecb56718dedd368d246910970
BLAKE2b-256 a57808d600f57142bd0bb4d53c56a2269cbd9e89c454fedf1fa75bf2b0671d75

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 06dab321910c512ee47905276fea38ae04091bd5d08f2c84507ff03f680baacc
MD5 1fb8e9611a09b82639f515fb4e6b43e6
BLAKE2b-256 b61b7406cec647e763f8bf007090201616b5e4ca36a63f75b1c055edbf5220a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b70beac81cea0ef25c660253537513d26af79edb8afb0b250508be7930a550a2
MD5 436bbe77494cde22c34fcb378d4c0872
BLAKE2b-256 2b2add28bd3757e3598839ca223546a2bc45a94c199a1dd1930deaa3b7167690

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4339c5bc9b2c6685451d632deb85d10abe2e57650352f27c08cc6a3108445fc1
MD5 39a40aa4298ebe4600255dc3e34a5764
BLAKE2b-256 6d1b357dc6be9ba96d0f5c03e999954311d34efb2766cf913c3d589d0b778220

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 4012f727238a3f1e23d0c3d7caa0507ad2031f29e2ecac275c25b897860df1ed
MD5 f07d25b779361605c67f311df49125bf
BLAKE2b-256 2c03e85ce817bea8f2ab8601f89fe08fe5ef61809fd075737560942ea00734a9

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for usearch-0.18.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9bdc5613efb2cdaf86f32099ffa6ee376c04f8e2e107ce29d3c92e1936f57077
MD5 269654bdc4e8047e0248846fa52dac39
BLAKE2b-256 85d4767ce9a39ceba19a6cb4d605702dba20f8b84d7eb6ef649ee0d11219eefe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ec88e2fb5634fea5994f419e6d758129509da7bf8285a6ca93cda960b12fd4fa
MD5 996a78c17bb44d0a46a3729efc4560c0
BLAKE2b-256 45c13d1610620d4ef8354a6dbc02f1ed3c32095ac441f2b1d730ffad34b698e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0bca042ab68bd6996a8f7116b3d06a2fd51c0c8bda7a4da6435b667c9448b0f5
MD5 eac757e17032d16e25738e4f3da11b60
BLAKE2b-256 c2a7ba9d73815890115a5296f0b4d16abddf3b9e311772a20ac3127ba1902571

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1f3e8c8b27daa557a3688e32b901ee71583af2fcccff8992f45b100ab0909c08
MD5 1c6625bbf14150bc18e4621248a1b926
BLAKE2b-256 8b844ad52e593a7c2670fee90845d8021e2764dab902c2f5c0b2adfb747d1071

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 23d17d8c59d62754a47904c8cf1509c949fa4f01e57aadbedcf19921053fb080
MD5 eb2a9d10bd74e7d3b64c2f50a8cca2a8
BLAKE2b-256 cad23f4f88417238dd7045be6a766facc90d3a8525cc0665794ef73c62c7fb8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d13c5e028e971e67eeb713e792fcb7f91f309974958ca30df5f6e73bfb1975c5
MD5 593dd5c801bae5e68df8e57c2fdcbc82
BLAKE2b-256 0243cd84bf128e9f607bc0679da83f3f7234833ad01092a1dd8dbbe7824decfc

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for usearch-0.18.8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f2e660d1c25bb06c0108ec23642c4c175d078b0f01d8c7b690d5179e88d617b5
MD5 4eac25ebfd088de7a650cd6b4618591e
BLAKE2b-256 9763261c2fb214ace4abacc71ef84bf6e20bf90359c5f6990a56d09caa0f81a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fa67e1fdaad7f6f8a38c9b1c46d4e943ce545783a85fb19eb099b020d99ee535
MD5 e8293dd0dcc3bbdc54c7a2511caa0309
BLAKE2b-256 aa57663a2ad53e1759476c23a4333323d27d9ed94426166d41a037ae387cdd7a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 95cf38a2891c9c4d330717efddc77c649732a7c345f8cd2d6e42ef86c5954e5f
MD5 c4621e73ce7b2c5285afe09047b90b3a
BLAKE2b-256 48168e1063a40ecb5cbfef06ebf24d9be307f9623d7acccbe7eee76fc171e535

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db26f5d45b893d3b5261ad175e8de39b2ae562c30ea54e17631375c771cab425
MD5 b4e7717f46b136c0e5b083514ed9817f
BLAKE2b-256 8ec25add8bc1ba48415357b858ed31bf35f2ec9a1164c00b7ea033de9a82a683

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 80a7b782c6a61554fd903a0fa283bbe36e18656d107f43e253cb363a798a85c4
MD5 2bd0358272778bb881cd47f011305ec8
BLAKE2b-256 dc0b22699b96d78bc9948be745598b098295ce198b3d0c6d2700b0e63c538e16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 233984d8811cf14c020ffb4cdf017d21a63b8ad2bea66dec65e966625a4eed32
MD5 e46778d0d34f9312940186bc31e3cb41
BLAKE2b-256 528c0b1260209b04d77ab4ca34fcece02ac3c2d167f2f7a29a685f50921159b3

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for usearch-0.18.8-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 8042af585e5bf66e92cf9097ba11f5c209a8d30680702b78d56c199fcacbf7a7
MD5 dd11a4a0969fdbebad7aae4aec39ca56
BLAKE2b-256 36ffeb4a661e1a681b190a56002faa600b48c690ee79e1aef277de242e7311aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b47851c77d73eb6274527b3f3c0a5b2a715d9ccf2b5834d31f4dfcbb8af808ba
MD5 518cd9ddf92730fb78d4a74b998df6ed
BLAKE2b-256 e6f54505cedf20d0f51e3c1b90333df7966147c75fa17d29cff442ff766fb83e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 378428758ae6366452f847a800a117acff8ca190aff026ad51bb6893bc70431e
MD5 9441dc2d656a326ce4df565f7fbac626
BLAKE2b-256 ee0045aa125b5ddb4b47979b6dd62246b9c44d4b7cf4718f569d98c664463cd0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cacb1cc1ca8b067b57c838132dedcdf657f95c5688f2a2544ea3d26677b2a43b
MD5 80ef83ef95797e255a3c58f1c9e8b868
BLAKE2b-256 97738b054c00f27f5efb7cb3b194dc74132aa6d29646a7fe935923c1b6d1337c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 61eabbd7ddd8567444ddf9d4ac5d45abc58a4e46bf78dd997f1e70460444fc83
MD5 d70c6f9b8ae126aabe48dfbc0670f91b
BLAKE2b-256 af957196368e4a7d557a082a3d70f7164b618b12655a45e923ce54331b4e58bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b1659acbfefffde0c60d07f62241ef9cd0670a5f06b58f443c69f81211094b3e
MD5 606a3c60428686d9cc646f7aa5314a98
BLAKE2b-256 052e999ad67fe262e3ff412f42f81e0f30b40297c37f5e378aacb3eea8a4e67f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for usearch-0.18.8-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 90b00b11dd7218610813207d7235edd0b27d6620c11e76f5636627e1d087d7fd
MD5 072a7d9daa6c425733bafc76926f97f5
BLAKE2b-256 98f8bd53862ee3b4a6104ac7943b037e7cfb50a6d81aa4ba372d9253e1b7f29f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp37-cp37m-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d6ae2e3b942ab4922053efff619e5118dc26f88df5ce7784218a0c4998035af5
MD5 20e6a53584579791c6cc5ec139808718
BLAKE2b-256 8d040dbc94c33ac79f0212084d00d05a6ad4214a3261e2525037a02a69ba103f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp37-cp37m-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9355c5fbd74f56cde080dd8cadc600f923cc40fcb0224098510f4ea9cb542620
MD5 ce75e6fcf75ba46c85442d7efebcbf29
BLAKE2b-256 1c89ae4dc976f2a8d7faa19c6aa49c4f11665b4cdf1b2ff9e1169daa0f94ce3f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for usearch-0.18.8-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2a845fe9da137e51301a15bf37ef0d0bcb581942894c3a41b5d1697b69438fb0
MD5 5356c8d3adafb959b945eb8bda64fc02
BLAKE2b-256 2de6c1014d501af62ccddccc2691b99eaa4c10aa64ab1c17b73ae08f34559eea

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