pub(crate) const RAW_FAST_PATH_MIN_BLOCK_LEN: usize = 512;
pub(crate) const RAW_FAST_PATH_MAX_SAMPLE_LEN: usize = 4096;
pub(crate) const RAW_FAST_PATH_MIN_SAMPLE_LEN: usize = 32;
const INCOMPRESSIBLE_REPEAT_TABLE_BITS: usize = 10;
const INCOMPRESSIBLE_REPEAT_TABLE_LEN: usize = 1 << INCOMPRESSIBLE_REPEAT_TABLE_BITS;
const INCOMPRESSIBLE_REPEAT_OCCUPANCY_WORDS: usize = INCOMPRESSIBLE_REPEAT_TABLE_LEN / 64;
const INCOMPRESSIBLE_REPEAT_HASH_MULT: u32 = 0x9E37_79B1;
const INCOMPRESSIBLE_MIN_DISTINCT_BYTES: usize = 200;
const INCOMPRESSIBLE_MAX_SYMBOL_DIVISOR: usize = 24;
const INCOMPRESSIBLE_REPEAT_DIVISOR: usize = 64;
#[inline]
fn scan_sample_region(
sample: &[u8],
counts: &mut [u16; 256],
repeat_table: &mut [u32; INCOMPRESSIBLE_REPEAT_TABLE_LEN],
repeat_occupied: &mut [u64; INCOMPRESSIBLE_REPEAT_OCCUPANCY_WORDS],
repeats: &mut usize,
repeat_guard: usize,
) -> bool {
let mut idx = 0usize;
let len = sample.len();
while idx + 4 <= len {
counts[sample[idx] as usize] += 1;
counts[sample[idx + 1] as usize] += 1;
counts[sample[idx + 2] as usize] += 1;
counts[sample[idx + 3] as usize] += 1;
let quad = u32::from_le_bytes([
sample[idx],
sample[idx + 1],
sample[idx + 2],
sample[idx + 3],
]);
let slot = (quad.wrapping_mul(INCOMPRESSIBLE_REPEAT_HASH_MULT) as usize)
>> (32 - INCOMPRESSIBLE_REPEAT_TABLE_BITS);
let word = slot / 64;
let bit = 1_u64 << (slot % 64);
let occupied = (repeat_occupied[word] & bit) != 0;
if occupied && repeat_table[slot] == quad {
*repeats += 1;
if *repeats > repeat_guard {
return true;
}
} else {
repeat_table[slot] = quad;
repeat_occupied[word] |= bit;
}
idx += 4;
}
while idx < len {
counts[sample[idx] as usize] += 1;
idx += 1;
}
false
}
#[inline]
pub(crate) fn block_looks_incompressible(block: &[u8]) -> bool {
if block.len() < RAW_FAST_PATH_MIN_BLOCK_LEN {
return false;
}
sample_looks_incompressible(block)
}
#[inline]
fn sample_looks_incompressible(block: &[u8]) -> bool {
sample_looks_incompressible_capped(block, RAW_FAST_PATH_MAX_SAMPLE_LEN)
}
fn sample_looks_incompressible_capped(block: &[u8], max_sample_len: usize) -> bool {
let sample_len = block.len().min(max_sample_len);
if sample_len < RAW_FAST_PATH_MIN_SAMPLE_LEN {
return false;
}
let mut regions: [&[u8]; 3] = [&[], &[], &[]];
let region_count = if sample_len == block.len() {
regions[0] = block;
1
} else {
let head_len = sample_len / 3;
let mid_len = sample_len / 3;
let tail_len = sample_len - head_len - mid_len;
let mid_start = (block.len() - mid_len) / 2;
regions[0] = &block[..head_len];
regions[1] = &block[mid_start..mid_start + mid_len];
regions[2] = &block[block.len() - tail_len..];
3
};
let max_symbol_guard = sample_len / INCOMPRESSIBLE_MAX_SYMBOL_DIVISOR;
let total_quads: usize = regions[..region_count].iter().map(|r| r.len() / 4).sum();
let repeat_guard = total_quads / INCOMPRESSIBLE_REPEAT_DIVISOR + 1;
let mut counts = [0u16; 256];
let mut repeat_table = [u32::MAX; INCOMPRESSIBLE_REPEAT_TABLE_LEN];
let mut repeat_occupied = [0_u64; INCOMPRESSIBLE_REPEAT_OCCUPANCY_WORDS];
let mut repeats = 0usize;
for region in ®ions[..region_count] {
if scan_sample_region(
region,
&mut counts,
&mut repeat_table,
&mut repeat_occupied,
&mut repeats,
repeat_guard,
) {
return false;
}
}
let distinct = counts.iter().filter(|&&count| count != 0).count();
let max_freq = counts.iter().copied().max().unwrap_or(0) as usize;
distinct >= INCOMPRESSIBLE_MIN_DISTINCT_BYTES
&& max_freq <= max_symbol_guard
&& repeats <= repeat_guard
}
#[cfg(test)]
mod tests;