Spec-Zone.ru › D

std.digest.crc

Реализация контрольной суммы циклического избытка (32 бита).

Категория Функции
API шаблонов CRC CRC32 CRC64ECMA CRC64ISO
API объектно-ориентированного программирования CRC32Digest CRC64ECMADigest CRC64ISODigest
Вспомогательные функции crcHexString crc32Of crc64ECMAOf crc64ISOOf



Этот модуль соответствует API, определённым в std.digest. Чтобы понять различия между API шаблонов и API объектно-ориентированного программирования, см. std.digest.

Этот модуль публично импортирует std.digest и может использоваться как автономный модуль.

Примечание
Контрольные суммы CRC обычно печатаются с старшим битом первым. При использовании std.digest.toHexString результат будет в неожиданном порядке. Используйте std.digest.toHexString с необязательным параметром порядка, чтобы указать порядок уменьшения для правильного результата. Псевдоним crcHexString также можно использовать для этой цели.
Лицензия:
Лицензия Boost 1.0.
Авторы:
Павел "EvilOne" Минаев, Алекс Рённе Петерсен, Иоганнес Фау
Ссылки
Wikipedia о CRC
Исходный код
std/digest/crc.d
Стандарты:
Реализует вариант CRC32 'common' IEEE (порядок младшего бита сначала, начальное значение uint.max, результат дополнения)
CTFE
Хеширования не работают в CTFE
Примеры:
//Template API
import std.digest.crc;

ubyte[4] hash = crc32Of("The quick brown fox jumps over the lazy dog");
writeln(crcHexString(hash)); // "414FA339"

//Feeding data
ubyte[1024] data;
CRC32 crc;
crc.put(data[]);
crc.start(); //Start again
crc.put(data[]);
hash = crc.finish();
Примеры:
//OOP API
import std.digest.crc;

auto crc = new CRC32Digest();
ubyte[] hash = crc.digest("The quick brown fox jumps over the lazy dog");
assert(crcHexString(hash) == "414FA339"); //352441c2

//Feeding data
ubyte[1024] data;
crc.put(data[]);
crc.reset(); //Start again
crc.put(data[]);
hash = crc.finish();
alias CRC32 = CRC!(32u, 3988292384LU).CRC;

Реализация CRC32 API шаблонов. См. std.digest для различий между шаблонами и API объектно-ориентированного программирования.

alias CRC64ECMA = CRC!(64u, 14514072000185962306LU).CRC;

Реализация CRC64-ECMA API шаблонов. См. std.digest для различий между шаблонами и API объектно-ориентированного программирования.

alias CRC64ISO = CRC!(64u, 15564440312192434176LU).CRC;

Реализация CRC64-ISO API шаблонов. См. std.digest для различий между шаблонами и API объектно-ориентированного программирования.

struct CRC(uint N, ulong P) if (N == 32 || N == 64);

Общий API шаблонов, используемый для реализаций CRC32 и CRC64.

Параметр N указывает размер хеша в битах. Параметр P определяет полином, используемый для сокращения.

Для удобства вы можете использовать псевдонимы CRC32, CRC65ECMA и CRC64ISO.

См. std.digest для различий между шаблонами и API объектно-ориентированного программирования.

Примеры:
//Simple example, hashing a string using crc32Of helper function
ubyte[4] hash32 = crc32Of("abc");
//Let's get a hash string
writeln(crcHexString(hash32)); // "352441C2"
// Repeat for CRC64
ubyte[8] hash64ecma = crc64ECMAOf("abc");
writeln(crcHexString(hash64ecma)); // "2CD8094A1A277627"
ubyte[8] hash64iso = crc64ISOOf("abc");
writeln(crcHexString(hash64iso)); // "3776C42000000000"
Примеры:
ubyte[1024] data;
//Using the basic API
CRC32 hash32;
CRC64ECMA hash64ecma;
CRC64ISO hash64iso;
//Initialize data here...
hash32.put(data);
ubyte[4] result32 = hash32.finish();
hash64ecma.put(data);
ubyte[8] result64ecma = hash64ecma.finish();
hash64iso.put(data);
ubyte[8] result64iso = hash64iso.finish();
Примеры:
//Let's use the template features:
//Note: When passing a CRC32 to a function, it must be passed by reference!
void doSomething(T)(ref T hash)
if (isDigest!T)
{
  hash.put(cast(ubyte) 0);
}
CRC32 crc32;
crc32.start();
doSomething(crc32);
writeln(crcHexString(crc32.finish())); // "D202EF8D"
// repeat for CRC64
CRC64ECMA crc64ecma;
crc64ecma.start();
doSomething(crc64ecma);
writeln(crcHexString(crc64ecma.finish())); // "1FADA17364673F59"
CRC64ISO crc64iso;
crc64iso.start();
doSomething(crc64iso);
writeln(crcHexString(crc64iso.finish())); // "6F90000000000000"
pure nothrow @nogc @trusted void put(scope const(ubyte)[] data...);

Используйте этот метод для подачи данных в хеш-функцию. Также реализует интерфейс std.range.primitives.isOutputRange для ubyte и const(ubyte)[].

pure nothrow @nogc @safe void start();

Используется для инициализации хеша CRC32.

Примечание
Для этой реализации CRC32 вызов start после конструктора по умолчанию не нужен. Вызов start необходим только для сброса хеша.
Общий код, работающий с различными типами хешей, должен всегда вызывать start.
pure nothrow @nogc @safe R finish();

Возвращает завершенный хеш CRC. Также вызывается start для сброса внутреннего состояния.

const pure nothrow @nogc @safe R peek();

Работает как finish но не сбрасывает внутреннее состояние, поэтому после вызова peek можно продолжить подачу данных в этот CRC.

ubyte[4] crc32Of(T...)(T data);

Это удобный псевдоним для std.digest.digest с использованием реализации CRC32.

Параметры:
T data InputRange из ElementType неявного преобразования в ubyte, ubyte[] или ubyte[num] или один или несколько массивов любого типа.
Возвращает:
CRC32 от данных
Примеры:
ubyte[] data = [4,5,7,25];
writeln(data.crc32Of); // [167, 180, 199, 131]

import std.utf : byChar;
writeln("hello"d.byChar.crc32Of); // [134, 166, 16, 54]

ubyte[4] hash = "abc".crc32Of();
writeln(hash); // digest!CRC32("ab", "c")

import std.range : iota;
enum ubyte S = 5, F = 66;
writeln(iota(S, F).crc32Of); // [59, 140, 234, 154]
ubyte[8] crc64ECMAOf(T...)(T data);

Это удобный псевдоним для std.digest.digest с использованием реализации CRC64-ECMA.

Параметры:
T data InputRange из ElementType неявного преобразования в ubyte, ubyte[] или ubyte[num] или один или несколько массивов любого типа.
Возвращает:
CRC64-ECMA от данных
Примеры:
ubyte[] data = [4,5,7,25];
writeln(data.crc64ECMAOf); // [58, 142, 220, 214, 118, 98, 105, 69]

import std.utf : byChar;
writeln("hello"d.byChar.crc64ECMAOf); // [177, 55, 185, 219, 229, 218, 30, 155]

ubyte[8] hash = "abc".crc64ECMAOf();
writeln("abc".crc64ECMAOf); // [39, 118, 39, 26, 74, 9, 216, 44]
writeln(hash); // digest!CRC64ECMA("ab", "c")

import std.range : iota;
enum ubyte S = 5, F = 66;
writeln(iota(S, F).crc64ECMAOf); // [6, 184, 91, 238, 46, 213, 127, 188]
ubyte[8] crc64ISOOf(T...)(T data);

Это удобный псевдоним для std.digest.digest.digest с использованием реализации CRC64-ISO.

Параметры:
T data InputRange из ElementType неявного преобразования в ubyte, ubyte[] или ubyte[num] или один или несколько массивов любого типа.
Возвращает:
CRC64-ISO от данных
Примеры:
ubyte[] data = [4,5,7,25];
writeln(data.crc64ISOOf); // [0, 0, 0, 80, 137, 232, 203, 120]

import std.utf : byChar;
writeln("hello"d.byChar.crc64ISOOf); // [0, 0, 16, 216, 226, 238, 62, 60]

ubyte[8] hash = "abc".crc64ISOOf();
writeln("abc".crc64ISOOf); // [0, 0, 0, 0, 32, 196, 118, 55]
writeln(hash); // digest!CRC64ISO("ab", "c")

import std.range : iota;
enum ubyte S = 5, F = 66;

writeln(iota(S, F).crc64ISOOf); // [21, 185, 116, 95, 219, 11, 54, 7]
alias crcHexString = crcHexString;

alias crcHexString = std.digest.toHexString!(Order.decreasing, 16LU, LetterCase.upper).toHexString;

вывод обычной строки CRC32.

alias CRC32Digest = std.digest.WrapperDigest!(CRC!(32u, 3988292384LU)).WrapperDigest;

Реализация CRC32 API объектно-ориентированного программирования. См. std.digest для различий между шаблонами и API объектно-ориентированного программирования.

Это псевдоним для std.digest.WrapperDigest!CRC32, см. там для дополнительной информации.

alias CRC64ECMADigest = std.digest.WrapperDigest!(CRC!(64u, 14514072000185962306LU)).WrapperDigest;

Реализация CRC64-ECMA API объектно-ориентированного программирования. См. std.digest для различий между шаблонами и API объектно-ориентированного программирования.

Это псевдоним для std.digest.digest.WrapperDigest!CRC64ECMA, см. там для дополнительной информации.

alias CRC64ISODigest = std.digest.WrapperDigest!(CRC!(64u, 15564440312192434176LU)).WrapperDigest;

Реализация CRC64-ISO API объектно-ориентированного программирования. См. std.digest для различий между шаблонами и API объектно-ориентированного программирования.

Это псевдоним для std.digest.digest.WrapperDigest!CRC64ISO, см. там для дополнительной информации.

Примеры:
//Simple example, hashing a string using Digest.digest helper function
auto crc = new CRC32Digest();
ubyte[] hash = crc.digest("abc");
//Let's get a hash string
writeln(crcHexString(hash)); // "352441C2"
Примеры:
//Let's use the OOP features:
void test(Digest dig)
{
 dig.put(cast(ubyte) 0);
}
auto crc = new CRC32Digest();
test(crc);

//Let's use a custom buffer:
ubyte[4] buf;
ubyte[] result = crc.finish(buf[]);
writeln(crcHexString(result)); // "D202EF8D"
Примеры:
//Simple example
auto hash = new CRC32Digest();
hash.put(cast(ubyte) 0);
ubyte[] result = hash.finish();
Примеры:
//using a supplied buffer
ubyte[4] buf;
auto hash = new CRC32Digest();
hash.put(cast(ubyte) 0);
ubyte[] result = hash.finish(buf[]);
//The result is now in result (and in buf. If you pass a buffer which is bigger than
//necessary, result will have the correct length, but buf will still have it's original
//length)

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

Spec-Zone.ru

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