1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_DJB2_H_
6#define MEDIA_BASE_DJB2_H_
7
8#include "base/basictypes.h"
9#include "media/base/media_export.h"
10
11// DJB2 is a hash algorithm with excellent distribution and speed
12// on many different sets.
13// It has marginally more collisions than FNV1, but makes up for it in
14// performance.
15// The return value is suitable for table lookups.
16// For small fixed sizes (ie a pixel), it has low overhead and inlines well.
17// For large data sets, it optimizes into assembly/simd and is appropriate
18// for realtime applications.
19// See Also:
20//   http://www.cse.yorku.ca/~oz/hash.html
21
22static const uint32 kDJB2HashSeed = 5381u;
23
24// These functions perform DJB2 hash. The simplest call is DJB2Hash() to
25// generate the DJB2 hash of the given data:
26//   uint32 hash = DJB2Hash(data1, length1, kDJB2HashSeed);
27//
28// You can also compute the DJB2 hash of data incrementally by making multiple
29// calls to DJB2Hash():
30//   uint32 hash_value = kDJB2HashSeed;  // Initial seed for DJB2.
31//   for (size_t i = 0; i < copy_lines; ++i) {
32//     hash_value = DJB2Hash(source, bytes_per_line, hash_value);
33//     source += source_stride;
34//   }
35
36// For the given buffer of data, compute the DJB2 hash of
37// the data. You can call this any number of times during the computation.
38MEDIA_EXPORT uint32 DJB2Hash(const void* buf, size_t len, uint32 seed);
39
40#endif  // MEDIA_BASE_DJB2_H_
41
42