import std.stdio; // Статическая таблица Gear (256 случайных 64-битных чисел) mixin(import("gear.d")); ulong fastcdc(const ubyte[] src, size_t n, size_t minSize, size_t maxSize, size_t normalSize, ulong maskS, ulong maskL) { if (n <= minSize) return n; if (n > maxSize) n = maxSize; if (n < normalSize) normalSize = n; ulong fp = 0; size_t i = 0; // Инициализация fp для первых minSize байт (без проверки cut-point) while (i < minSize) { fp = (fp << 1) + gear[src[i]]; i++; } // Цикл до normalSize (строгая маска) while (i < normalSize) { fp = (fp << 1) + gear[src[i]]; if ((fp & maskS) == 0) { return i; } i++; } // Цикл после (слабая маска) while (i < n) { fp = (fp << 1) + gear[src[i]]; if ((fp & maskL) == 0) { return i; } i++; } return n; // Достигнут max } void main() { // Текст mixin(import("text.d")); // Конвертация в ubyte[] (UTF-8) ubyte[] data = cast(ubyte[]) text; size_t totalLength = data.length; writefln("Общая длина текста (в байтах): %d", totalLength); // Параметры FastCDC size_t minSize = 100; size_t normalSize = 200; size_t maxSize = 500; ulong maskS = 0b1111_1111; ulong maskL = 0b1111; size_t offset = 0; size_t chunkNumber = 1; writeln("Размеры и содержимое чанков:"); while (offset < totalLength) { size_t remaining = totalLength - offset; size_t chunkSize = fastcdc(data[offset .. $], remaining, minSize, maxSize, normalSize, maskS, maskL); writefln("Чанк %d: %d байт", chunkNumber, chunkSize); string chunkContent = cast(string) data[offset .. offset + chunkSize]; writefln("Содержимое: %s\n", chunkContent); offset += chunkSize; chunkNumber++; } }