cdc/source/app.d

92 lines
2.6 KiB
D
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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