mirror of https://github.com/bsnes-emu/bsnes.git
44 lines
763 B
C++
44 lines
763 B
C++
|
#ifndef NALL_HASH_CRC16_HPP
|
||
|
#define NALL_HASH_CRC16_HPP
|
||
|
|
||
|
#include <nall/range.hpp>
|
||
|
|
||
|
namespace nall {
|
||
|
struct string;
|
||
|
namespace Hash {
|
||
|
|
||
|
struct CRC16 {
|
||
|
CRC16() { reset(); }
|
||
|
CRC16(const void* values, unsigned size) : CRC16() { data(values, size); }
|
||
|
|
||
|
auto reset() -> void {
|
||
|
checksum = ~0;
|
||
|
}
|
||
|
|
||
|
auto data(uint8_t value) -> void {
|
||
|
for(auto n : range(8)) {
|
||
|
if((checksum & 1) ^ (value & 1)) checksum = (checksum >> 1) ^ 0x8408;
|
||
|
else checksum >>= 1;
|
||
|
value >>= 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
auto data(const void* values, unsigned size) -> void {
|
||
|
auto p = (const uint8_t*)values;
|
||
|
while(size--) data(*p++);
|
||
|
}
|
||
|
|
||
|
auto value() -> uint16_t {
|
||
|
return ~checksum;
|
||
|
}
|
||
|
|
||
|
inline auto digest() -> string;
|
||
|
|
||
|
private:
|
||
|
uint16_t checksum;
|
||
|
};
|
||
|
|
||
|
}}
|
||
|
|
||
|
#endif
|