Documentation ¶
Overview ¶
Package crc implements generic CRC calculations up to 64 bits wide. It aims to be fairly complete, allowing users to match pretty much any CRC algorithm used in the wild by choosing appropriate Parameters. And it's also fairly fast for everyday use.
This package has been largely inspired by Ross Williams' 1993 paper "A Painless Guide to CRC Error Detection Algorithms". A good list of parameter sets for various CRC algorithms can be found at http://reveng.sourceforge.net/crc-catalogue/.
Index ¶
- Variables
- func CalculateCRC(crcParams *Parameters, data []byte) uint64
- type Hash
- func (h *Hash) BlockSize() int
- func (h *Hash) CRC() uint64
- func (h *Hash) CRC16() uint16
- func (h *Hash) CRC32() uint32
- func (h *Hash) CRC8() uint8
- func (h *Hash) CalculateCRC(data []byte) uint64
- func (h *Hash) Reset()
- func (h *Hash) Size() int
- func (h *Hash) Sum(in []byte) []byte
- func (h *Hash) Table() *Table
- func (h *Hash) Update(p []byte)
- func (h *Hash) Write(p []byte) (n int, err error)
- type Parameters
- type Table
- func (t *Table) CRC(curValue uint64) uint64
- func (t *Table) CRC16(curValue uint64) uint16
- func (t *Table) CRC32(curValue uint64) uint32
- func (t *Table) CRC8(curValue uint64) uint8
- func (t *Table) CalculateCRC(data []byte) uint64
- func (t *Table) InitCrc() uint64
- func (t *Table) UpdateCrc(curValue uint64, p []byte) uint64
Constants ¶
This section is empty.
Variables ¶
var ( // X-25 CRC parameters, also known as CRC-16/IBM-SDLC, CRC-16/ISO-HDLC, CRC-B X25 = &Parameters{Width: 16, Polynomial: 0x1021, Init: 0xFFFF, ReflectIn: true, ReflectOut: true, FinalXor: 0xFFFF} // CCITT CRC parameters CCITT = &Parameters{Width: 16, Polynomial: 0x1021, Init: 0xFFFF, ReflectIn: false, ReflectOut: false, FinalXor: 0x0} // CRC16 CRC parameters, also known as ARC CRC16 = &Parameters{Width: 16, Polynomial: 0x8005, Init: 0x0000, ReflectIn: true, ReflectOut: true, FinalXor: 0x0} // XMODEM is a set of CRC parameters commonly referred as "XMODEM" XMODEM = &Parameters{Width: 16, Polynomial: 0x1021, Init: 0x0000, ReflectIn: false, ReflectOut: false, FinalXor: 0x0} // XMODEM2 is another set of CRC parameters commonly referred as "XMODEM" XMODEM2 = &Parameters{Width: 16, Polynomial: 0x8408, Init: 0x0000, ReflectIn: true, ReflectOut: true, FinalXor: 0x0} // CRC32 is by far the the most commonly used CRC-32 polynom and set of parameters CRC32 = &Parameters{Width: 32, Polynomial: 0x04C11DB7, Init: 0xFFFFFFFF, ReflectIn: true, ReflectOut: true, FinalXor: 0xFFFFFFFF} // IEEE is an alias to CRC32 IEEE = CRC32 // Castagnoli polynomial. used in iSCSI. And also provided by hash/crc32 package. Castagnoli = &Parameters{Width: 32, Polynomial: 0x1EDC6F41, Init: 0xFFFFFFFF, ReflectIn: true, ReflectOut: true, FinalXor: 0xFFFFFFFF} // CRC32C is an alias to Castagnoli CRC32C = Castagnoli // Koopman polynomial Koopman = &Parameters{Width: 32, Polynomial: 0x741B8CD7, Init: 0xFFFFFFFF, ReflectIn: true, ReflectOut: true, FinalXor: 0xFFFFFFFF} // CRC64ISO is set of parameters commonly known as CRC64-ISO CRC64ISO = &Parameters{Width: 64, Polynomial: 0x000000000000001B, Init: 0xFFFFFFFFFFFFFFFF, ReflectIn: true, ReflectOut: true, FinalXor: 0xFFFFFFFFFFFFFFFF} // CRC64ECMA is set of parameters commonly known as CRC64-ECMA CRC64ECMA = &Parameters{Width: 64, Polynomial: 0x42F0E1EBA9EA3693, Init: 0xFFFFFFFFFFFFFFFF, ReflectIn: true, ReflectOut: true, FinalXor: 0xFFFFFFFFFFFFFFFF} )
Functions ¶
func CalculateCRC ¶
func CalculateCRC(crcParams *Parameters, data []byte) uint64
CalculateCRC implements simple straight forward bit by bit calculation. It is relatively slow for large amounts of data, but does not require any preparation steps. As a result, it might be faster in some cases then building a table required for faster calculation.
Note: this implementation follows section 8 ("A Straightforward CRC Implementation") of Ross N. Williams paper as even though final/sample implementation of this algorithm provided near the end of that paper (and followed by most other implementations) is a bit faster, it does not work for polynomials shorter then 8 bits. And if you need speed, you shoud probably be using table based implementation anyway.
Types ¶
type Hash ¶
type Hash struct {
// contains filtered or unexported fields
}
Hash represents the partial evaluation of a checksum using table-driven implementation. It also implements hash.Hash interface.
func NewHash ¶
func NewHash(crcParams *Parameters) *Hash
NewHash creates a new Hash instance configured for table driven CRC calculation according to parameters specified.
func NewHashWithTable ¶ added in v1.1.0
NewHashWithTable creates a new Hash instance configured for table driven CRC calculation using a Table instance created elsewhere.
func (*Hash) BlockSize ¶
BlockSize returns the hash's underlying block size. The Write method must be able to accept any amount of data, but it may operate more efficiently if all writes are a multiple of the block size. See hash.Hash interface.
func (*Hash) CRC16 ¶
CRC16 is a convenience method to spare end users from explicit type conversion every time this package is used. Underneath, it just calls CRC() method.
func (*Hash) CRC32 ¶
CRC32 is a convenience method to spare end users from explicit type conversion every time this package is used. Underneath, it just calls CRC() method.
func (*Hash) CRC8 ¶
CRC8 is a convenience method to spare end users from explicit type conversion every time this package is used. Underneath, it just calls CRC() method.
func (*Hash) CalculateCRC ¶
CalculateCRC is a convenience function allowing to calculate CRC in one call.
func (*Hash) Reset ¶
func (h *Hash) Reset()
Reset resets the Hash to its initial state. See hash.Hash interface.
func (*Hash) Sum ¶
Sum appends the current hash to b and returns the resulting slice. It does not change the underlying hash state. See hash.Hash interface.
type Parameters ¶
type Parameters struct { Width uint // Width of the CRC expressed in bits Polynomial uint64 // Polynomial used in this CRC calculation ReflectIn bool // ReflectIn indicates whether input bytes should be reflected ReflectOut bool // ReflectOut indicates whether input bytes should be reflected Init uint64 // Init is initial value for CRC calculation FinalXor uint64 // Xor is a value for final xor to be applied before returning result }
Parameters represents set of parameters defining a particular CRC algorithm.
type Table ¶ added in v1.1.0
type Table struct {
// contains filtered or unexported fields
}
Table represents the partial evaluation of a checksum using table-driven implementation. It is essentially immutable once initialized and thread safe as a result.
func NewTable ¶ added in v1.1.0
func NewTable(crcParams *Parameters) *Table
NewTable creates and initializes a new Table for the CRC algorithm specified by the crcParams.
func (*Table) CRC16 ¶ added in v1.1.0
CRC16 is a convenience method to spare end users from explicit type conversion every time this package is used. Underneath, it just calls CRC() method.
func (*Table) CRC32 ¶ added in v1.1.0
CRC32 is a convenience method to spare end users from explicit type conversion every time this package is used. Underneath, it just calls CRC() method.
func (*Table) CRC8 ¶ added in v1.1.0
CRC8 is a convenience method to spare end users from explicit type conversion every time this package is used. Underneath, it just calls CRC() method.
func (*Table) CalculateCRC ¶ added in v1.1.0
CalculateCRC is a convenience function allowing to calculate CRC in one call.