FFmpeg
murmur3.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2013 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * @ingroup lavu_murmur3
24  * Public header for MurmurHash3 hash function implementation.
25  */
26 
27 #ifndef AVUTIL_MURMUR3_H
28 #define AVUTIL_MURMUR3_H
29 
30 #include <stddef.h>
31 #include <stdint.h>
32 
33 /**
34  * @defgroup lavu_murmur3 Murmur3
35  * @ingroup lavu_hash
36  * MurmurHash3 hash function implementation.
37  *
38  * MurmurHash3 is a non-cryptographic hash function, of which three
39  * incompatible versions were created by its inventor Austin Appleby:
40  *
41  * - 32-bit output
42  * - 128-bit output for 32-bit platforms
43  * - 128-bit output for 64-bit platforms
44  *
45  * FFmpeg only implements the last variant: 128-bit output designed for 64-bit
46  * platforms. Even though the hash function was designed for 64-bit platforms,
47  * the function in reality works on 32-bit systems too, only with reduced
48  * performance.
49  *
50  * @anchor lavu_murmur3_seedinfo
51  * By design, MurmurHash3 requires a seed to operate. In response to this,
52  * libavutil provides two functions for hash initiation, one that requires a
53  * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer
54  * as the seed, and therefore does not (av_murmur3_init()).
55  *
56  * To make hashes comparable, you should provide the same seed for all calls to
57  * this hash function -- if you are supplying one yourself, that is.
58  *
59  * @{
60  */
61 
62 /**
63  * Allocate an AVMurMur3 hash context.
64  *
65  * @return Uninitialized hash context or `NULL` in case of error
66  */
67 struct AVMurMur3 *av_murmur3_alloc(void);
68 
69 /**
70  * Initialize or reinitialize an AVMurMur3 hash context with a seed.
71  *
72  * @param[out] c Hash context
73  * @param[in] seed Random seed
74  *
75  * @see av_murmur3_init()
76  * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of
77  * seeds for MurmurHash3.
78  */
79 void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed);
80 
81 /**
82  * Initialize or reinitialize an AVMurMur3 hash context.
83  *
84  * Equivalent to av_murmur3_init_seeded() with a built-in seed.
85  *
86  * @param[out] c Hash context
87  *
88  * @see av_murmur3_init_seeded()
89  * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of
90  * seeds for MurmurHash3.
91  */
92 void av_murmur3_init(struct AVMurMur3 *c);
93 
94 /**
95  * Update hash context with new data.
96  *
97  * @param[out] c Hash context
98  * @param[in] src Input data to update hash with
99  * @param[in] len Number of bytes to read from `src`
100  */
101 void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len);
102 
103 /**
104  * Finish hashing and output digest value.
105  *
106  * @param[in,out] c Hash context
107  * @param[out] dst Buffer where output digest value is stored
108  */
109 void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]);
110 
111 /**
112  * @}
113  */
114 
115 #endif /* AVUTIL_MURMUR3_H */
av_murmur3_alloc
struct AVMurMur3 * av_murmur3_alloc(void)
Allocate an AVMurMur3 hash context.
Definition: murmur3.c:35
av_murmur3_final
void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16])
Finish hashing and output digest value.
Definition: murmur3.c:144
seed
static unsigned int seed
Definition: videogen.c:78
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
AVMurMur3
Definition: murmur3.c:28
len
int len
Definition: vorbis_enc_data.h:426
av_murmur3_init_seeded
void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed)
Initialize or reinitialize an AVMurMur3 hash context with a seed.
Definition: murmur3.c:40
av_murmur3_init
void av_murmur3_init(struct AVMurMur3 *c)
Initialize or reinitialize an AVMurMur3 hash context.
Definition: murmur3.c:46
av_murmur3_update
void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len)
Update hash context with new data.
Definition: murmur3.c:95
src
#define src
Definition: vp8dsp.c:248