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 необходим только для сброса хеша.
- 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 dataInputRangeиз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 dataInputRangeиз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 dataInputRangeиз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