summaryrefslogtreecommitdiffstats
path: root/src/Runtime/Source/system/Qt3DSHash.h
blob: 8baa2dba059d25fd44a26080c358b48ea2d1e7bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/****************************************************************************
**
** Copyright (C) 1993-2009 NVIDIA Corporation.
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt 3D Studio.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#pragma once
#include "Qt3DSConfig.h"

//==============================================================================
//	Namespace
//==============================================================================
namespace Q3DStudio {

//==============================================================================
/**
 *	Utility class transforming a string into a hash value.
 */
class CHash
{
    //==============================================================================
    //	Methods
    //==============================================================================
public: // Static utility
    //==============================================================================
    /**
     *	We use the hashing algorithm called "sdbm".
     *
     *	This algorithm was created from sdbm (a public-domain reimplementation
     *	of ndbm) database library. It was found to do well in scrambling bits,
     *	causing better distribution of the keys and fewer splits. it also happens
     *	to be a good general hashing function with good distribution. the actual
     *	function is hash(i) = hash(i - 1) * 65599 + str[i]; what is included below
     *	is the faster version used in gawk. [there is even a faster, duff-device
     *	version] the magic constant 65599 was picked out of thin air while
     *	experimenting with different constants, and turns out to be a prime. this
     *	is one of the algorithms used in berkeley db (see sleepycat) and elsewhere.
     *
     *	@param inString		the string to hash
     *	@return the hash value
     */
    static TStringHash HashString(const CHAR *inString)
    {
        TStringHash theHash = 0;
        INT32 theChar = *inString;
        INT32 theCount = 0;
        while (theChar && (theCount < HASH_LIMIT)) {
            theChar = *inString++;
            theHash = theChar + (theHash << 6) + (theHash << 16) - theHash;
            ++theCount;
        }

        return theHash;
    }

    //==============================================================================
    /**
     *	31-bit hash with MSB set to 0
     *
     *	@param inString		the string to hash
     *	@return the 31-bit hash value
     */
    static TEventCommandHash HashEventCommand(const CHAR *inString)
    {
        return HashString(inString) & 0x7fffffff;
    }

    //==============================================================================
    /**
     *	26-bit hash with MSBs all set to 0
     *
     *	@param inString		the string to hash
     *	@return the 26-bit hash value
     */
    static TAttributeHash HashAttribute(const CHAR *inString)
    {
        return HashString(inString) & 0x03ffffff;
    }
};

} // namespace Q3DStudio