cdc/source/app.d

80 lines
1.8 KiB
D

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++;
}
}