#ifndef TASK01_QUEUE_MODEL_H #define TASK01_QUEUE_MODEL_H #include #include typedef struct QueueMessage { uint32_t sequence; uint32_t payload; uint32_t checksum; } QueueMessage; typedef struct QueueEvidence { uint32_t sequence; uint32_t event; uint32_t tick; uint32_t actor; uint32_t value; uint32_t committed; } QueueEvidence; static inline uint32_t fc05_message_checksum( uint32_t sequence, uint32_t payload ) { return 0x51000000U ^ sequence ^ payload; } static inline int fc05_message_is_valid( const QueueMessage * message ) { return message != NULL && message->checksum == fc05_message_checksum( message->sequence, message->payload ); } static inline uint32_t fc05_digest( const QueueEvidence * events, size_t count ) { uint32_t hash = 2166136261U; size_t index; for( index = 0U; index < count; ++index ) { hash = ( hash ^ events[ index ].event ) * 16777619U; hash = ( hash ^ events[ index ].actor ) * 16777619U; hash = ( hash ^ events[ index ].value ) * 16777619U; hash = ( hash ^ events[ index ].committed ) * 16777619U; } return hash; } #endif