64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			V
		
	
	
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
 | 
						|
// Use of this source code is governed by an MIT license
 | 
						|
// that can be found in the LICENSE file.
 | 
						|
 | 
						|
// This is a very basic crc32 implementation
 | 
						|
// at the moment with no architecture optimizations
 | 
						|
module crc32
 | 
						|
 | 
						|
// polynomials
 | 
						|
pub const (
 | 
						|
	ieee       = 0xedb88320
 | 
						|
	castagnoli = 0x82f63b78
 | 
						|
	koopman    = 0xeb31d82e
 | 
						|
)
 | 
						|
 | 
						|
// The size of a CRC-32 checksum in bytes.
 | 
						|
const (
 | 
						|
	size = 4
 | 
						|
)
 | 
						|
 | 
						|
struct Crc32 {
 | 
						|
mut:
 | 
						|
	table []u32
 | 
						|
}
 | 
						|
 | 
						|
fn(c mut Crc32) generate_table(poly int) {
 | 
						|
	for i in 0..256 {
 | 
						|
		mut crc := u32(i)
 | 
						|
		for _ in 0..8 {
 | 
						|
			if crc & u32(1) == u32(1) {
 | 
						|
				crc = (crc >> 1) ^ u32(poly)
 | 
						|
			} else {
 | 
						|
				crc >>= u32(1)
 | 
						|
			}
 | 
						|
		}
 | 
						|
		c.table << crc
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
fn(c &Crc32) sum32(b []byte) u32 {
 | 
						|
	mut crc := ~u32(0)
 | 
						|
	for i in 0..b.len {
 | 
						|
		crc = c.table[byte(crc)^b[i]] ^ (crc >> 8)
 | 
						|
	}
 | 
						|
	return ~crc
 | 
						|
}
 | 
						|
 | 
						|
pub fn(c &Crc32) checksum(b []byte) u32 {
 | 
						|
	return c.sum32(b)
 | 
						|
}
 | 
						|
 | 
						|
// pass the polinomial to use
 | 
						|
pub fn new(poly int) &Crc32 {
 | 
						|
	mut c := &Crc32{}
 | 
						|
	c.generate_table(poly)
 | 
						|
	return c
 | 
						|
}
 | 
						|
 | 
						|
// calculate crc32 using ieee
 | 
						|
pub fn sum(b []byte) u32 {
 | 
						|
	c := new(ieee)
 | 
						|
	return c.sum32(b)
 | 
						|
}
 |