80 lines
1.8 KiB
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++;
|
|
}
|
|
}
|