#ifndef _KHASH_H
#define _KHASH_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#ifdef __GNUC__
#define _deprecated(x) __attribute__((deprecated))
#else
#define _deprecated(x)
#endif
#define KHASH_ALGO_DEFAULT ((uint8_t)0)
#define KHASH_ALGO_CRC32 ((uint8_t)1)
#define KHASH_ALGO_CRC64 ((uint8_t)2)
#define KHASH_ALGO_SHA256 ((uint8_t)3)
#define KHASH_ALGO_SHA256_TRUNCATED ((uint8_t)4)
#define KHASH_SALT_TYPE_NONE ((uint8_t)0)
#define KHASH_SALT_TYPE_DEFAULT ((uint8_t)1)
#define KHASH_SALT_TYPE_SPECIFIC ((uint8_t)2)
#define KHASH_SALT_TYPE_RANDOM ((uint8_t)3)
typedef struct {
uint8_t salt_type;
uint32_t size;
uint8_t* body;
} khash_salt;
typedef struct {
uint8_t algo;
uint64_t flags;
khash_salt salt;
} khash_ctx;
#define KHASH_SUCCESS ((int32_t)0)
#define KHASH_ERROR_IO ((int32_t)1)
#define KHASH_ERROR_FORMAT ((int32_t)2)
#define KHASH_ERROR_LENGTH ((int32_t)3)
#define KHASH_ERROR_RNG ((int32_t)4)
#define KHASH_ERROR_UNKNOWN ((int32_t)-1)
extern int32_t khash_max_length(uint8_t algo, size_t input_length, size_t* digest_length);
extern int32_t khash_new_context(uint8_t algo, uint8_t salt_type, const void* data, size_t size, khash_ctx* output);
extern int32_t khash_free_context(khash_ctx* ctx);
extern int32_t khash_clone_context(const khash_ctx* src, khash_ctx* dst);
extern int32_t khash_length(const khash_ctx* context, const void* data, size_t size, size_t* length);
extern int32_t khash_do(khash_ctx* context, const void* data, size_t size, char* string, size_t strlen);
extern int32_t khash_new_salt(uint8_t salt_type, const void* data, size_t size, khash_salt* output) _deprecated("Use `khash_new_context` instead.");
extern int32_t khash_free_salt(khash_salt* salt) _deprecated("Use `khash_free_context` instead.");
extern int32_t khash_clone_salt(const khash_salt* src, khash_salt* dst) _deprecated("Use `khash_close_context` instead.");
#ifdef __cplusplus
}
#endif
#undef _deprecated
#endif