summaryrefslogtreecommitdiffstats
path: root/src/system/Qt3DSHash.h
blob: b074d9cb82261c3a86db0d1b845dc3e92bcbc06d (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/****************************************************************************
**
** 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"
#include <qstring.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;
    }

    static TStringHash HashString(const QString &inString)
    {
        TStringHash theHash = 0;
        INT32 theCount = 0;
        for (auto theChar : inString) {
            if (theCount == HASH_LIMIT)
                break;
            theHash = theChar.toLatin1() + (theHash << 6) + (theHash << 16) - theHash;
            ++theCount;
        }
        theHash = (theHash << 6) + (theHash << 16) - theHash;

        return theHash;
    }

    static TStringHash HashString(const QString &inString, int begin, int end)
    {
        TStringHash theHash = 0;
        INT32 theCount = 0;
        for (int i = begin; i < end; ++i) {
            if (theCount == HASH_LIMIT)
                break;
            theHash = inString.at(i).toLatin1() + (theHash << 6) + (theHash << 16) - theHash;
            ++theCount;
        }
        theHash = (theHash << 6) + (theHash << 16) - theHash;

        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;
    }

    static TAttributeHash HashAttribute(const QString &inString)
    {
        return HashString(inString) & 0x03ffffff;
    }
};

} // namespace Q3DStudio