import std.stdio; import std.string; // Статическая таблица 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; // 100 байт size_t normalSize = 200; // 200 байт (цель) size_t maxSize = 500; // 500 байт // Маски (для normalSize ~200 байт, log2(200) ≈ 8 бит, уровень нормализации 2) // ulong maskS = (1UL << 8) - 1; // 8 бит: 0b11111111 // ulong maskL = (1UL << 4) - 1; // 4 бита: 0b1111 // writefln("1UL: %u\n1UL << 8: %u\n(1UL << 8) - 1: %u", 1UL, 1UL << 8, maskS); // writefln("1UL: %u\n1UL << 4: %u\n(1UL << 4) - 1: %u", 1UL, 1UL << 4, maskL); // writeln(); ulong maskS = 0b11111111; 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); writefln("Содержимое: %s\n", chunkContent.length > 50 ? chunkContent[0 .. 50] ~ "..." : chunkContent); offset += chunkSize; chunkNumber++; } }