aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/old/vlib/hash/crc32/crc32.v
blob: d29aa124b76db2ff0e11f4df0a56f75794eeb5c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Copyright (c) 2019-2021 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       = u32(0xedb88320)
	castagnoli = u32(0x82f63b78)
	koopman    = u32(0xeb31d82e)
)

// The size of a CRC-32 checksum in bytes.
const (
	size = 4
)

struct Crc32 {
mut:
	table []u32
}

fn (mut c 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 polynomial 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(int(crc32.ieee))
	return c.sum32(b)
}