A collection of programs written in ponylang.io
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

54 lines
1.5 KiB

#ifndef __LIBFNV_H
#define __LIBFNV_H
#include <stdint.h>
static __inline__ void fnv32Init(uint32_t *hval);
static __inline__ void fnv32UpdateChar(uint32_t *hval, unsigned char ch);
static __inline__ void fnv32UpdateBuffer(uint32_t *hval, const void *buf, uint64_t len);
static __inline__ void fnv64Init(uint64_t *hval);
static __inline__ void fnv64UpdateChar(uint64_t *hval, unsigned char ch);
static __inline__ void fnv64UpdateBuffer(uint64_t *hval, const void *buf, uint64_t len);
static __inline__ void fnv64Init(uint64_t *hval) {
*hval = 14695981039346656037ULL;
}
static __inline__ void fnv32Init(uint32_t *hval) {
*hval = 2166136261;
}
static __inline__ void fnv32UpdateChar(uint32_t *hval, unsigned char ch) {
*hval ^= ch;
*hval *= 16777619;
}
static __inline__ void fnv32UpdateBuffer(uint32_t *hval, const void *buf, uint64_t len) {
uint64_t i;
unsigned char *qbuf = (unsigned char *) buf;
for (i = 0; i < len; ++i) {
unsigned char ch = *qbuf++;
*hval ^= ch;
*hval *= 16777619;
}
}
static __inline__ void fnv64UpdateChar(uint64_t *hval, unsigned char ch) {
*hval ^= ch;
*hval *= 1099511628211U;
}
static __inline__ void fnv64UpdateBuffer(uint64_t *hval, const void *buf, uint64_t len) {
uint64_t i;
for (i = 0; i < len; ++i) {
unsigned char ch = ((unsigned char *) buf)[i];
fnv64UpdateChar(hval, ch);
}
}
static __inline__ void fnv64UpdateString(uint64_t *hval, const char *buf) {
fnv64UpdateBuffer(hval, buf, strlen(buf));
}
#endif