Merge branch 'master' into next
[sliver-openvswitch.git] / lib / hash.c
1 /*
2  * Copyright (c) 2008, 2009 Nicira Networks.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include <config.h>
17 #include "hash.h"
18 #include <string.h>
19
20 /* Returns the hash of the 'n' 32-bit words at 'p', starting from 'basis'.
21  * 'p' must be properly aligned. */
22 uint32_t
23 hash_words(const uint32_t *p, size_t n, uint32_t basis)
24 {
25     uint32_t a, b, c;
26
27     a = b = c = 0xdeadbeef + (((uint32_t) n) << 2) + basis;
28
29     while (n > 3) {
30         a += p[0];
31         b += p[1];
32         c += p[2];
33         HASH_MIX(a, b, c);
34         n -= 3;
35         p += 3;
36     }
37
38     switch (n) {
39     case 3:
40         c += p[2];
41         /* fall through */
42     case 2:
43         b += p[1];
44         /* fall through */
45     case 1:
46         a += p[0];
47         HASH_FINAL(a, b, c);
48         /* fall through */
49     case 0:
50         break;
51     }
52     return c;
53 }
54
55 /* Returns the hash of the pair of aligned 32-bit words at 'p', starting from
56  * 'basis'. */
57 uint32_t
58 hash_2words(const uint32_t *p, uint32_t basis)
59 {
60     uint32_t a, b, c;
61
62     a = b = c = 0xdeadbeef + (2 << 2) + basis;
63     b += p[1];
64     a += p[0];
65     HASH_FINAL(a, b, c);
66
67     return c;
68 }
69
70 /* Returns the hash of the 'n' bytes at 'p', starting from 'basis'. */
71 uint32_t
72 hash_bytes(const void *p_, size_t n, uint32_t basis)
73 {
74     const uint8_t *p = p_;
75     uint32_t a, b, c;
76     uint32_t tmp[3];
77
78     a = b = c = 0xdeadbeef + n + basis;
79
80     while (n >= sizeof tmp) {
81         memcpy(tmp, p, sizeof tmp);
82         a += tmp[0];
83         b += tmp[1];
84         c += tmp[2];
85         HASH_MIX(a, b, c);
86         n -= sizeof tmp;
87         p += sizeof tmp;
88     }
89
90     if (n) {
91         tmp[0] = tmp[1] = tmp[2] = 0;
92         memcpy(tmp, p, n);
93         a += tmp[0];
94         b += tmp[1];
95         c += tmp[2];
96         HASH_FINAL(a, b, c);
97     }
98
99     return c;
100 }