Skip to main content

A Vectorized Dictionary for Python

Project description

phashmap - A Vectorized Python Dict/Set

phashmap is a copy of GetPy(https://github.com/atom-moyer/getpy), to provide the highest performance python dict/set that integrates into the python scientific ecosystem for Linux and Windows.

Installation

pip install phashmap

Linux and Windows build is currently distributed. If you would like to build the package from source you can clone the repo and run python setup.py install. Compilation will require 16gb of ram. I am working on getting that down.

About

GetPy is a thin binding to the Parallel Hashmap (https://github.com/greg7mdp/parallel-hashmap.git) which is the current state of the art unordered map/set with minimal memory overhead and fast runtime speed. The binding layer is supported by PyBind11 (https://github.com/pybind/pybind11.git) which is fast to compile and simple to extend.

How To Use

The gp.Dict and gp.Set objects are designed to maintain a similar interface to the corresponding standard python objects. There are some key differences though, which are necessary for vectorization and other performance considerations.

  1. gp.Dict.__init__ has three arguments key_type, value_type, and default_value. The type arguments are define which compiled data structure will be used under the hood, and the full list of preset combinations of np.dtypes is found with gp.dict_types. You can also specify a default_value at construction which must be castable to the value_type. This is the value returned by the dictionary if a key is not found.

  2. All of getpy.Dict methods support a vectorized interface. Therefore, methods like gp.Dict.__getitem__, gp.Dict.__setitem__, and gp.Dict.__delitem__ can be performed with an np.ndarray. That allows the performance critical for-loop to happen within the compiled c++. Note that some dunder methods cannot be vectorized such as __contains__. Therefore, some keywords like in do not behave as expected. Those methods are renamed without the double underscores to note their deviation from the standard interface.

  3. If a key does not exist, gp.Dict.__getitem__ will return the default_value. If you do not specify the default_value, it will default to the default constructor of your data type (all 0 bits). If you would like to know the difference between a key that does not exist and a key that returns the default value, you should first run gp.contains on your key/array of keys, and then retrieve values corresponding to keys that exist.

  4. There is also a gp.MultiDict object. This object stores multiple unique values per key.

Examples

Simple Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=key_type)
values = np.random.randint(1, 1000, size=10 ** 2, dtype=value_type)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

Default Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=key_type)
values = np.random.randint(1, 1000, size=10 ** 2, dtype=value_type)

gp_dict = gp.Dict(key_type, value_type, default_value=42)
gp_dict[keys] = values

random_keys = np.random.randint(1, 1000, size=500, dtype=key_type)
random_values = gp_dict[random_keys]

Byteset Example

import numpy as np
import phashmap as gp

key_type = np.dtype('S8')
value_type = np.dtype('S8')

keys = np.array([np.random.bytes(8) for i in range(10 ** 2)], dtype=key_type)
values = np.array([np.random.bytes(8) for i in range(10 ** 2)], dtype=value_type)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

Multidimensional Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=key_type).reshape(10, 10)
values = np.random.randint(1, 1000, size=10 ** 2, dtype=value_type).reshape(10, 10)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

Bitpack Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 2, dtype=np.dtype('u2')).reshape(25, 4).view(key_type)
values = np.random.randint(1, 1000, size=(10 ** 2) / 2, dtype=np.dtype('u4')).reshape(25, 2).view(value_type)

gp_dict = gp.Dict(key_type, value_type)
gp_dict[keys] = values

unpacked_values = gp_dict[keys].view(np.dtype('u4'))

Serialization Example

import numpy as np
import phashmap as gp

key_type = np.dtype('u8')
value_type = np.dtype('u8')

keys = np.random.randint(1, 1000, size=10 ** 1, dtype=key_type)
values = np.random.randint(1, 1000, size=10 ** 1, dtype=value_type)

gp_dict_1 = gp.Dict(key_type, value_type)
gp_dict_1[keys] = values
gp_dict_1.dump('test/test.hashtable.bin')

gp_dict_2 = gp.Dict(key_type, value_type)
gp_dict_2.load('test/test.hashtable.bin')

Supported Data Types

dict_types = {
    (np.dtype('u4'), np.dtype('u1')) : _gp.Dict_u4_u1,
    (np.dtype('u4'), np.dtype('u2')) : _gp.Dict_u4_u2,
    (np.dtype('u4'), np.dtype('u4')) : _gp.Dict_u4_u4,
    (np.dtype('u4'), np.dtype('u8')) : _gp.Dict_u4_u8,
    (np.dtype('u4'), np.dtype('i1')) : _gp.Dict_u4_i1,
    (np.dtype('u4'), np.dtype('i2')) : _gp.Dict_u4_i2,
    (np.dtype('u4'), np.dtype('i4')) : _gp.Dict_u4_i4,
    (np.dtype('u4'), np.dtype('i8')) : _gp.Dict_u4_i8,
    (np.dtype('u4'), np.dtype('f4')) : _gp.Dict_u4_f4,
    (np.dtype('u4'), np.dtype('f8')) : _gp.Dict_u4_f8,
    (np.dtype('u4'), np.dtype('S8')) : _gp.Dict_u4_S8,
    (np.dtype('u4'), np.dtype('S16')) : _gp.Dict_u4_S16,
    (np.dtype('u8'), np.dtype('u1')) : _gp.Dict_u8_u1,
    (np.dtype('u8'), np.dtype('u2')) : _gp.Dict_u8_u2,
    (np.dtype('u8'), np.dtype('u4')) : _gp.Dict_u8_u4,
    (np.dtype('u8'), np.dtype('u8')) : _gp.Dict_u8_u8,
    (np.dtype('u8'), np.dtype('i1')) : _gp.Dict_u8_i1,
    (np.dtype('u8'), np.dtype('i2')) : _gp.Dict_u8_i2,
    (np.dtype('u8'), np.dtype('i4')) : _gp.Dict_u8_i4,
    (np.dtype('u8'), np.dtype('i8')) : _gp.Dict_u8_i8,
    (np.dtype('u8'), np.dtype('f4')) : _gp.Dict_u8_f4,
    (np.dtype('u8'), np.dtype('f8')) : _gp.Dict_u8_f8,
    (np.dtype('u8'), np.dtype('S8')) : _gp.Dict_u8_S8,
    (np.dtype('u8'), np.dtype('S16')) : _gp.Dict_u8_S16,
    (np.dtype('i4'), np.dtype('u1')) : _gp.Dict_i4_u1,
    (np.dtype('i4'), np.dtype('u2')) : _gp.Dict_i4_u2,
    (np.dtype('i4'), np.dtype('u4')) : _gp.Dict_i4_u4,
    (np.dtype('i4'), np.dtype('u8')) : _gp.Dict_i4_u8,
    (np.dtype('i4'), np.dtype('i1')) : _gp.Dict_i4_i1,
    (np.dtype('i4'), np.dtype('i2')) : _gp.Dict_i4_i2,
    (np.dtype('i4'), np.dtype('i4')) : _gp.Dict_i4_i4,
    (np.dtype('i4'), np.dtype('i8')) : _gp.Dict_i4_i8,
    (np.dtype('i4'), np.dtype('f4')) : _gp.Dict_i4_f4,
    (np.dtype('i4'), np.dtype('f8')) : _gp.Dict_i4_f8,
    (np.dtype('i4'), np.dtype('S8')) : _gp.Dict_i4_S8,
    (np.dtype('i4'), np.dtype('S16')) : _gp.Dict_i4_S16,
    (np.dtype('i8'), np.dtype('u1')) : _gp.Dict_i8_u1,
    (np.dtype('i8'), np.dtype('u2')) : _gp.Dict_i8_u2,
    (np.dtype('i8'), np.dtype('u4')) : _gp.Dict_i8_u4,
    (np.dtype('i8'), np.dtype('u8')) : _gp.Dict_i8_u8,
    (np.dtype('i8'), np.dtype('i1')) : _gp.Dict_i8_i1,
    (np.dtype('i8'), np.dtype('i2')) : _gp.Dict_i8_i2,
    (np.dtype('i8'), np.dtype('i4')) : _gp.Dict_i8_i4,
    (np.dtype('i8'), np.dtype('i8')) : _gp.Dict_i8_i8,
    (np.dtype('i8'), np.dtype('f4')) : _gp.Dict_i8_f4,
    (np.dtype('i8'), np.dtype('f8')) : _gp.Dict_i8_f8,
    (np.dtype('i8'), np.dtype('S8')) : _gp.Dict_i8_S8,
    (np.dtype('i8'), np.dtype('S16')) : _gp.Dict_i8_S16,
    (np.dtype('S8'), np.dtype('u1')) : _gp.Dict_S8_u1,
    (np.dtype('S8'), np.dtype('u2')) : _gp.Dict_S8_u2,
    (np.dtype('S8'), np.dtype('u4')) : _gp.Dict_S8_u4,
    (np.dtype('S8'), np.dtype('u8')) : _gp.Dict_S8_u8,
    (np.dtype('S8'), np.dtype('i1')) : _gp.Dict_S8_i1,
    (np.dtype('S8'), np.dtype('i2')) : _gp.Dict_S8_i2,
    (np.dtype('S8'), np.dtype('i4')) : _gp.Dict_S8_i4,
    (np.dtype('S8'), np.dtype('i8')) : _gp.Dict_S8_i8,
    (np.dtype('S8'), np.dtype('f4')) : _gp.Dict_S8_f4,
    (np.dtype('S8'), np.dtype('f8')) : _gp.Dict_S8_f8,
    (np.dtype('S8'), np.dtype('S8')) : _gp.Dict_S8_S8,
    (np.dtype('S8'), np.dtype('S16')) : _gp.Dict_S8_S16,
    (np.dtype('S16'), np.dtype('u1')) : _gp.Dict_S16_u1,
    (np.dtype('S16'), np.dtype('u2')) : _gp.Dict_S16_u2,
    (np.dtype('S16'), np.dtype('u4')) : _gp.Dict_S16_u4,
    (np.dtype('S16'), np.dtype('u8')) : _gp.Dict_S16_u8,
    (np.dtype('S16'), np.dtype('i1')) : _gp.Dict_S16_i1,
    (np.dtype('S16'), np.dtype('i2')) : _gp.Dict_S16_i2,
    (np.dtype('S16'), np.dtype('i4')) : _gp.Dict_S16_i4,
    (np.dtype('S16'), np.dtype('i8')) : _gp.Dict_S16_i8,
    (np.dtype('S16'), np.dtype('f4')) : _gp.Dict_S16_f4,
    (np.dtype('S16'), np.dtype('f8')) : _gp.Dict_S16_f8,
    (np.dtype('S16'), np.dtype('S8')) : _gp.Dict_S16_S8,
    (np.dtype('S16'), np.dtype('S16')) : _gp.Dict_S16_S16,
}

set_types = {
    np.dtype('u4') : _gp.Set_u4,
    np.dtype('u8') : _gp.Set_u8,
    np.dtype('i4') : _gp.Set_i4,
    np.dtype('i8') : _gp.Set_i8,
    np.dtype('S8') : _gp.Set_S8,
    np.dtype('S16') : _gp.Set_S16,
}

Project details


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

If you're not sure about the file name format, learn more about wheel file names.

phashmap-0.0.1-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

phashmap-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (56.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

phashmap-0.0.1-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

phashmap-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (56.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

phashmap-0.0.1-cp311-cp311-win_amd64.whl (974.1 kB view details)

Uploaded CPython 3.11Windows x86-64

phashmap-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (55.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

phashmap-0.0.1-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

phashmap-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (55.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

phashmap-0.0.1-cp39-cp39-win_amd64.whl (12.2 kB view details)

Uploaded CPython 3.9Windows x86-64

phashmap-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (55.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

phashmap-0.0.1-cp38-cp38-win_amd64.whl (974.8 kB view details)

Uploaded CPython 3.8Windows x86-64

phashmap-0.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (55.8 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

phashmap-0.0.1-cp37-cp37m-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.7mWindows x86-64

phashmap-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (59.6 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

File details

Details for the file phashmap-0.0.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9bdf1764abd52eaa49def534802da9fa696817dc1c5f36aee0058621f444317e
MD5 0686432326d6e2c016f1db23d7caeed4
BLAKE2b-256 e738b49e3536f4e37df8a8d68df519666710467c63fcdb15d3db8c386d1f448d

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0bcc4b3c13cc127d9fd26eb71ae328d97c1051d518e1ef4b155cbd809b249953
MD5 a4bd2088d45dc18e87e49721e74415ca
BLAKE2b-256 42daf79844567d8ce992328dc006e7f23b2c2f88652852a4cc0f39a2fb1fc23b

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4f1a3f68d672d829d77904cae5e3b2d5d93a9445d135f23924ea9ae9eff3b03d
MD5 96b67b405550019f52ec0ab7d3891da6
BLAKE2b-256 a88648b2a9501a8d7876b6d5d1bd4ef1df3bc5d939b157e4b1193e0cff59b85f

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7762cc8687d1cb949b0ce0dac429a76b20049e7e95563648354db5bb03b864b2
MD5 a891a6cf9b4d94340e17f7750f2e57a4
BLAKE2b-256 34050b0fb8b922acce6092b8a2a0adf3050057abb7419151112e4cef34c00b58

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 974.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b8e60aa200d1a824e3a7878c3931b6dc7d63eac08dea08d5889a04cd4971eb02
MD5 717d6a708a1a6562dcae0a136157b5c7
BLAKE2b-256 731a8657ecc79a17e49efba36217772a94ff9af9f1b2b6c1788f58308de5eac5

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b9d5d2f4cbd0b5edabce3251747796d863ccebadc1fd5c4f13b739fd5f664761
MD5 71afb6e812c563d732bde47c74e29c50
BLAKE2b-256 e718c418a447fa066bf04733425e00c91b34d7b2e19c562313a859152c6281ac

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 acbdd585aeb5f3bf42671fb324b1561c2b37dedd6c43a3a3101f41efe597c9cc
MD5 c473d796361d03ef56d80bb0fba75189
BLAKE2b-256 504d2eaf23e5e35e8916919297d7d135c7ba8d17445c9d3d872e91913ab02079

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1ff545c12451be081c3c075c2e0329606e8718fd950370282ed352f952de6e17
MD5 cbf1a3bb37c6d8bf91127dd211dbb473
BLAKE2b-256 a983e4a051b1cf403498df5c3092da3807e2eeb9ea5153fdbca1cc67fb962d9b

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 12.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 445fdde7ca4675206002db25be97eb6d7b1296a277546eee3f49a37d229faf42
MD5 062895458a20b3934f92d92d06001f74
BLAKE2b-256 0f665ff244e5bb5b167471d4de7104b687d7a6ded3b0815d04f9787ef666f3d1

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1630357b3385aa92e739f50e2cd5d1e211e1961d500e4fdf090c46025aaee619
MD5 5a5a86cee903a4552cb2bd738a6a8e1a
BLAKE2b-256 e0d17849161a854c61aaa5dc5fc7ff6d0a4831d53990752787721fe3ec9e3ecb

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 974.8 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c7555c6c8131876a961a1adf70ce448e292d86d63a02d7cb2c528c5acb768704
MD5 d4f3f8267ad7b8d004397de04b057b10
BLAKE2b-256 2d136f540ae4d3e38e8dd871afe64800e4224e35151cfed6a748dfe2c73ca1a5

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 749aa2ca80362618730fa779dd559674a534d8dea472ea918308ce3bbe8e54ea
MD5 38a9ee6ed69eac718df6bdc8e1c99f0c
BLAKE2b-256 ce746364057e8d9e38836e7939a9538ab9299d3379b7e2c5c120d0a8565b0a49

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: phashmap-0.0.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for phashmap-0.0.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 22ce0e24267321a8397dc4d0bddf6e2317c92e17a8473eb086326aa7e662239a
MD5 be133a6216e17a0ef31f4cceea4df3ce
BLAKE2b-256 9ac8a94865774fbf11b5d0261426063ec66a154032d856e8cc0fe8a3c996e51d

See more details on using hashes here.

File details

Details for the file phashmap-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for phashmap-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e920e5aba2668d8ae33489652999f12df0350726f32a941404da1a6015e5cf21
MD5 1a018fa48c647a2da00677474c15e3ee
BLAKE2b-256 c4554ddadbb6acb0cec4451c07fc923df6b6a5906bbec55f33ee5e47cc259edc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page