hash.c revision 1.2
1/*	$NetBSD: hash.c,v 1.2 2020/08/11 13:15:39 christos Exp $	*/
2
3/* $OpenLDAP$ */
4/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 2000-2020 The OpenLDAP Foundation.
7 * Portions Copyright 2000-2003 Kurt D. Zeilenga.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted only as authorized by the OpenLDAP
12 * Public License.
13 *
14 * A copy of this license is available in the file LICENSE in the
15 * top-level directory of the distribution or, alternatively, at
16 * <http://www.OpenLDAP.org/license.html>.
17 */
18
19/* This implements the Fowler / Noll / Vo (FNV-1) hash algorithm.
20 * A summary of the algorithm can be found at:
21 *   http://www.isthe.com/chongo/tech/comp/fnv/index.html
22 */
23
24#include <sys/cdefs.h>
25__RCSID("$NetBSD: hash.c,v 1.2 2020/08/11 13:15:39 christos Exp $");
26
27#include "portable.h"
28
29#include <lutil_hash.h>
30
31/* offset and prime for 32-bit FNV-1 */
32#define HASH_OFFSET	0x811c9dc5U
33#define HASH_PRIME	16777619
34
35
36/*
37 * Initialize context
38 */
39void
40lutil_HASHInit( struct lutil_HASHContext *ctx )
41{
42	ctx->hash = HASH_OFFSET;
43}
44
45/*
46 * Update hash
47 */
48void
49lutil_HASHUpdate(
50    struct lutil_HASHContext	*ctx,
51    const unsigned char		*buf,
52    ber_len_t		len )
53{
54	const unsigned char *p, *e;
55	ber_uint_t h;
56
57	p = buf;
58	e = &buf[len];
59
60	h = ctx->hash;
61
62	while( p < e ) {
63		h *= HASH_PRIME;
64		h ^= *p++;
65	}
66
67	ctx->hash = h;
68}
69
70/*
71 * Save hash
72 */
73void
74lutil_HASHFinal( unsigned char *digest, struct lutil_HASHContext *ctx )
75{
76	ber_uint_t h = ctx->hash;
77
78	digest[0] = h & 0xffU;
79	digest[1] = (h>>8) & 0xffU;
80	digest[2] = (h>>16) & 0xffU;
81	digest[3] = (h>>24) & 0xffU;
82}
83