mirror of
https://github.com/Karaka-Management/cOMS.git
synced 2026-01-11 11:18:40 +00:00
76 lines
1.5 KiB
C
76 lines
1.5 KiB
C
/**
|
|
* Jingga
|
|
*
|
|
* @copyright Jingga
|
|
* @license OMS License 2.0
|
|
* @version 1.0.0
|
|
* @link https://jingga.app
|
|
*/
|
|
#ifndef TOS_HASH_CRC_H
|
|
#define TOS_HASH_CRC_H
|
|
|
|
#include "../stdlib/Types.h"
|
|
#include "../architecture/Intrinsics.h"
|
|
|
|
inline
|
|
uint32 crc32_software_u8(const byte* data, size_t length) {
|
|
uint32 crc = 0xFFFFFFFF;
|
|
|
|
// Standard CRC-32 polynomial
|
|
uint32 polynomial = 0xEDB88320;
|
|
|
|
for (size_t i = 0; i < length; ++i) {
|
|
crc ^= data[i];
|
|
for (byte bit = 0; bit < 8; ++bit) {
|
|
crc = (crc >> 1);
|
|
|
|
if (crc & 1) {
|
|
crc ^= polynomial;
|
|
}
|
|
}
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
inline
|
|
uint32 crc32_intrin_u8(const byte* data, size_t length) {
|
|
uint32 crc = 0xFFFFFFFF;
|
|
for (size_t i = 0; i < length; ++i) {
|
|
crc = intrin_crc32_u8(crc, data[i]);
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
inline
|
|
uint32 crc32_intrin_u16(const uint16* data, size_t length) {
|
|
uint32 crc = 0xFFFFFFFF;
|
|
for (size_t i = 0; i < length; ++i) {
|
|
crc = intrin_crc32_u16(crc, data[i]);
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
inline
|
|
uint32 crc32_intrin_u32(const uint32* data, size_t length) {
|
|
uint32 crc = 0xFFFFFFFF;
|
|
for (size_t i = 0; i < length; ++i) {
|
|
crc = intrin_crc32_u32(crc, data[i]);
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
inline
|
|
uint32 crc32_intrin_u64(const uint64* data, size_t length) {
|
|
uint64 crc = 0xFFFFFFFF;
|
|
for (size_t i = 0; i < length; ++i) {
|
|
crc = intrin_crc32_u64(crc, data[i]);
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
#endif |