92 lines
2.6 KiB
D
92 lines
2.6 KiB
D
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++;
|
||
}
|
||
}
|