Spec-Zone.ru › D

std.digest.murmurhash

Вычисляет хэш-значения MurmurHash произвольных данных. MurmurHash — это некриптографическая хеш-функция, подходящая для общего поиска на основе хеширования. Она оптимизирована для x86, но может использоваться на всех архитектурах.

Текущая версия — MurmurHash3, которая генерирует 32-битное или 128-битное значение хеша. Более старые MurmurHash 1 и 2 в настоящее время не поддерживаются.

MurmurHash3 существует в трёх вариантах, упорядоченных по возрастанию производительности:

  • MurmurHash3!32 генерирует 32-битное значение и оптимизирована для 32-битных архитектур
  • MurmurHash3!(128, 32) генерирует 128-битное значение и оптимизирована для 32-битных архитектур
  • MurmurHash3!(128, 64) генерирует 128-битное значение и оптимизирована для 64-битных архитектур

Примечание
  • MurmurHash3!(128, 32) и MurmurHash3!(128, 64) генерируют разные значения.
  • Текущая реализация оптимизирована для архитектур little endian. Она будет давать разные результаты на архитектурах big endian и будет иметь несколько менее равномерное распределение.
Этот модуль соответствует API, определённому в std.digest. Этот модуль публично импортирует std.digest и может использоваться как самостоятельный модуль.
Источник
std/digest/murmurhash.d
Лицензия:
Boost License 1.0.
Авторы:
Guillaume Chatelet
Ссылки
Реализация-ссылка
Википедия
struct MurmurHash3(uint size, uint opt = size_t.sizeof == 8 ? 64 : 32);

Реализует функции MurmurHash3. Вы можете указать разрядность хеша в битах. Для 128-битных хешей можно указать, оптимизировать ли для 32 или 64-битных архитектур. Если вы не укажете значение разрядности, будет выбрана самая быстрая версия для платформы.

Этот хешер совместим с API Digest:

  • void start()
  • void put(scope const(ubyte)[] data...)
  • ubyte[Element.sizeof] finish()


Он также предоставляет более быстрый, низкоуровневый API, работающий с данными размером Element.sizeof:
  • void putElements(scope const(Element[]) elements...)
  • void putRemainder(scope const(ubyte[]) data...)
  • void finalize()
  • Element get()
  • ubyte[Element.sizeof] getBytes()

Примеры:
Удобный шаблон digest позволяет быстро хешировать любые данные.
ubyte[4] hashed = digest!(MurmurHash3!32)([1, 2, 3, 4]);
writeln(hashed); // [0, 173, 69, 68]
Примеры:
Также можно хешировать данные типа ubyte по частям, создав экземпляр хешера и вызвав метод 'put'.
const(ubyte)[] data1 = [1, 2, 3];
const(ubyte)[] data2 = [4, 5, 6, 7];
// The incoming data will be buffered and hashed element by element.
MurmurHash3!32 hasher;
hasher.put(data1);
hasher.put(data2);
// The call to 'finish' ensures:
// - the remaining bits are processed
// - the hash gets finalized
auto hashed = hasher.finish();
writeln(hashed); // [181, 151, 88, 252]
alias Element = uint;

Тип элемента для 32-битной реализации.

pure nothrow @nogc void putElement(uint block);

Добавляет один элемент данных без увеличения element_count. Убедитесь, что вы увеличиваете element_count на Element.sizeof для каждого вызова putElement.

pure nothrow @nogc void putRemainder(scope const(ubyte[]) data...);

Добавляет оставшиеся байты. Это необходимо вызвать только один раз после putElement и перед finalize.

pure nothrow @nogc void finalize();

Включает element_count и завершает вычисление хеша.

pure nothrow @nogc Element get();

Возвращает хеш в виде значения uint.

pure nothrow @nogc ubyte[4] getBytes();

Возвращает текущее значение хеша в виде массива ubyte.

pure nothrow @nogc void putElements(scope const(Element[]) elements...);

Добавляет массив элементов сразу. Эффективнее добавлять как можно больше данных в одном вызове. На платформах, не поддерживающих чтение без выравнивания (MIPS или старые ARM-чипы), компилятор может генерировать более медленный код для обеспечения корректности.

pure nothrow void put(scope const(ubyte)[] data...);

Добавляет данные к диджесту. Этот метод можно вызывать много раз подряд после начала, но до завершения.

pure nothrow ubyte[Element.sizeof] finish();

Завершает вычисление хеша и возвращает вычисленное значение. Обратите внимание, что finish можно вызвать только один раз, и последующие вызовы put запрещены.

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_digest_murmurhash.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API