|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 /* Implementations of hash functions. */ |
|
7 |
|
8 #include "mozilla/HashFunctions.h" |
|
9 #include "mozilla/Types.h" |
|
10 |
|
11 #include <string.h> |
|
12 |
|
13 namespace mozilla { |
|
14 |
|
15 uint32_t |
|
16 HashBytes(const void* bytes, size_t length) |
|
17 { |
|
18 uint32_t hash = 0; |
|
19 const char* b = reinterpret_cast<const char*>(bytes); |
|
20 |
|
21 /* Walk word by word. */ |
|
22 size_t i = 0; |
|
23 for (; i < length - (length % sizeof(size_t)); i += sizeof(size_t)) { |
|
24 /* Do an explicitly unaligned load of the data. */ |
|
25 size_t data; |
|
26 memcpy(&data, b + i, sizeof(size_t)); |
|
27 |
|
28 hash = AddToHash(hash, data, sizeof(data)); |
|
29 } |
|
30 |
|
31 /* Get the remaining bytes. */ |
|
32 for (; i < length; i++) |
|
33 hash = AddToHash(hash, b[i]); |
|
34 |
|
35 return hash; |
|
36 } |
|
37 |
|
38 } /* namespace mozilla */ |