\r\n

51Degrees Device Detection C/C++  4.3

A device detection library that is used natively or by 51Degrees products

hash.h

1 /* *********************************************************************
2  * This Original Work is copyright of 51 Degrees Mobile Experts Limited.
3  * Copyright 2019 51 Degrees Mobile Experts Limited, 5 Charlotte Close,
4  * Caversham, Reading, Berkshire, United Kingdom RG4 7BY.
5  *
6  * This Original Work is the subject of the following patents and patent
7  * applications, owned by 51 Degrees Mobile Experts Limited of 5 Charlotte
8  * Close, Caversham, Reading, Berkshire, United Kingdom RG4 7BY:
9  * European Patent No. 3438848; and
10  * United States Patent No. 10,482,175.
11  *
12  * This Original Work is licensed under the European Union Public Licence (EUPL)
13  * v.1.2 and is subject to its terms as set out below.
14  *
15  * If a copy of the EUPL was not distributed with this file, You can obtain
16  * one at https://opensource.org/licenses/EUPL-1.2.
17  *
18  * The 'Compatible Licences' set out in the Appendix to the EUPL (as may be
19  * amended by the European Commission) shall be deemed incompatible for
20  * the purposes of the Work and the provisions of the compatibility
21  * clause in Article 5 of the EUPL shall not apply.
22  *
23  * If using the Work as, or as part of, a network application, by
24  * including the attribution notice(s) required under Article 5 of the EUPL
25  * in the end user terms of the application under an appropriate heading,
26  * such notice(s) shall fulfill the requirements of that article.
27  * ********************************************************************* */
28 
29 #ifndef FIFTYONE_DEGREES_HASH_INCLUDED
30 #define FIFTYONE_DEGREES_HASH_INCLUDED
31 
40 #if !defined(DEBUG) && !defined(_DEBUG) && !defined(NDEBUG)
41 #define NDEBUG
42 #endif
43 
44 #include <stdlib.h>
45 #include <stdio.h>
46 #include <string.h>
47 #include <limits.h>
48 #include <math.h>
49 #include <time.h>
50 #include <ctype.h>
51 #include <assert.h>
52 #ifdef _MSC_VER
53 #pragma warning(push)
54 #pragma warning(disable : 5105)
55 #include <windows.h>
56 #pragma warning(pop)
57 #endif
58 #include "../common-cxx/data.h"
59 #include "../common-cxx/exceptions.h"
60 #include "../common-cxx/threading.h"
61 #include "../common-cxx/file.h"
62 #include "../common-cxx/collection.h"
63 #include "../common-cxx/evidence.h"
64 #include "../common-cxx/list.h"
65 #include "../common-cxx/resource.h"
66 #include "../common-cxx/properties.h"
67 #include "../common-cxx/status.h"
68 #include "../common-cxx/date.h"
69 #include "../common-cxx/pool.h"
70 #include "../common-cxx/component.h"
71 #include "../common-cxx/property.h"
72 #include "../common-cxx/value.h"
73 #include "../common-cxx/profile.h"
74 #include "../common-cxx/overrides.h"
75 #include "../config-dd.h"
76 #include "../dataset-dd.h"
77 #include "../results-dd.h"
78 #include "graph.h"
79 
81 #ifndef FIFTYONE_DEGREES_CACHE_CONCURRENCY
82 #ifndef FIFTYONE_DEGREES_NO_THREADING
83 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 10
84 #else
85 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 1
86 #endif
87 #endif
88 
92 #ifndef FIFTYONE_DEGREES_HASH_DIFFERENCE
93 #define FIFTYONE_DEGREES_HASH_DIFFERENCE 0
94 #endif
95 
99 #ifndef FIFTYONE_DEGREES_HASH_DRIFT
100 #define FIFTYONE_DEGREES_HASH_DRIFT 0
101 #endif
102 
107 #ifndef FIFTYONE_DEGREES_STRING_CACHE_SIZE
108 #define FIFTYONE_DEGREES_STRING_CACHE_SIZE 10000
109 #endif
110 
114 #ifndef FIFTYONE_DEGREES_STRING_LOADED
115 #define FIFTYONE_DEGREES_STRING_LOADED 100
116 #endif
117 
121 #ifndef FIFTYONE_DEGREES_NODE_CACHE_SIZE
122 #define FIFTYONE_DEGREES_NODE_CACHE_SIZE 50000
123 #endif
124 
128 #ifndef FIFTYONE_DEGREES_NODE_LOADED
129 #define FIFTYONE_DEGREES_NODE_LOADED 100
130 #endif
131 
135 #ifndef FIFTYONE_DEGREES_PROFILE_CACHE_SIZE
136 #define FIFTYONE_DEGREES_PROFILE_CACHE_SIZE 10000
137 #endif
138 
142 #ifndef FIFTYONE_DEGREES_PROFILE_LOADED
143 #define FIFTYONE_DEGREES_PROFILE_LOADED 100
144 #endif
145 
149 #ifndef FIFTYONE_DEGREES_VALUE_CACHE_SIZE
150 #define FIFTYONE_DEGREES_VALUE_CACHE_SIZE 500
151 #endif
152 
156 #ifndef FIFTYONE_DEGREES_VALUE_LOADED
157 #define FIFTYONE_DEGREES_VALUE_LOADED 0
158 #endif
159 
163 #ifndef FIFTYONE_DEGREES_PROPERTY_CACHE_SIZE
164 #define FIFTYONE_DEGREES_PROPERTY_CACHE_SIZE 0
165 #endif
166 
170 #ifndef FIFTYONE_DEGREES_PROPERTY_LOADED
171 #define FIFTYONE_DEGREES_PROPERTY_LOADED INT_MAX
172 #endif
173 
182 typedef enum e_fiftyone_degrees_hash_match_method {
183  FIFTYONE_DEGREES_HASH_MATCH_METHOD_NONE,
184  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PERFORMANCE,
185  FIFTYONE_DEGREES_HASH_MATCH_METHOD_COMBINED,
186  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PREDICTIVE,
189 
191 #pragma pack(push, 1)
192 typedef struct fiftyoneDegrees_hash_dataset_header_t {
193  const int32_t versionMajor;
194  const int32_t versionMinor;
195  const int32_t versionBuild;
196  const int32_t versionRevision;
198  const byte tag[16];
199  const byte exportTag[16];
200  const int32_t copyrightOffset;
202  const int16_t age;
203  const int32_t minUserAgentCount;
205  const int32_t nameOffset;
207  const int32_t formatOffset;
235 #pragma pack(pop)
236 
242 typedef struct fiftyone_degrees_config_hash_t {
257  int32_t difference;
261  int32_t drift;
268  bool traceRoute;
273 
278 typedef struct fiftyone_degrees_hash_rootnodes_t {
284 
294 typedef struct fiftyone_degrees_dataset_hash_t {
315 
317 typedef struct fiftyone_degrees_result_hash_t fiftyoneDegreesResultHash;
325 typedef struct fiftyone_degrees_result_hash_t {
327  uint32_t *profileOffsets;
334  int32_t iterations;
336  int32_t difference;
338  int32_t drift;
340  int32_t matchedNodes;
348 
352 #define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS \
353  fiftyoneDegreesResultsDeviceDetection b; \
354  fiftyoneDegreesCollectionItem propertyItem; \
356  fiftyoneDegreesList values; \
358  fiftyoneDegreesEvidenceKeyValuePairArray* pseudoEvidence;
361 FIFTYONE_DEGREES_ARRAY_TYPE(
474  const char *fileName,
475  fiftyoneDegreesException *exception);
476 
501  const char *fileName,
502  fiftyoneDegreesException *exception);
503 
524  void *memory,
525  long size,
526  fiftyoneDegreesException *exception);
527 
474  const char *fileName,
475  fiftyoneDegreesException *exception);
476 
501  const char *fileName,
502  fiftyoneDegreesException *exception);
503 
524  void *memory,
525  long size,
526  fiftyoneDegreesException *exception);
527 
551  void *memory,
552  long size,
553  fiftyoneDegreesException *exception);
554 
571  fiftyoneDegreesException *exception);
572 
584  const char* userAgent,
585  size_t userAgentLength,
586  fiftyoneDegreesException *exception);
587 
599  const char* deviceId,
600  size_t deviceIdLength,
601  fiftyoneDegreesException *exception);
602 
618  uint32_t userAgentCapacity,
619  uint32_t overridesCapacity);
620 
627 EXTERNAL void fiftyoneDegreesResultsHashFree(
628  fiftyoneDegreesResultsHash* results);
629 
643  int requiredPropertyIndex,
644  fiftyoneDegreesException *exception);
645 
659  int requiredPropertyIndex,
660  fiftyoneDegreesException *exception);
661 
669 
685  int requiredPropertyIndex,
686  fiftyoneDegreesException *exception);
687 
702  const char *propertyName,
703  char *buffer,
704  size_t bufferLength,
705  const char *separator,
706  fiftyoneDegreesException *exception);
707 
720 EXTERNAL size_t
723  const int requiredPropertyIndex,
724  char *buffer,
725  size_t bufferLength,
726  const char *separator,
727  fiftyoneDegreesException *exception);
728 
749  fiftyoneDegreesException *exception);
750 
772  const char *fileName,
773  fiftyoneDegreesException *exception);
774 
798  void *source,
799  long length,
800  fiftyoneDegreesException *exception);
801 
814 
822  fiftyoneDegreesDataSetHash *dataSet);
823 
824 
840  const char *propertyName,
841  const char *valueName,
842  void *state,
844  fiftyoneDegreesException *exception);
845 
861  char *destination,
862  size_t size,
863  fiftyoneDegreesException *exception);
864 
877  char *destination,
878  size_t size,
879  fiftyoneDegreesException *exception);
880 
885 #endif
uint32_t predictiveNodeOffset
Offset in the nodes collection of the root node for the predictive graph.
Definition: hash.h:281
const fiftyoneDegreesCollectionHeader nodes
Size and location of the nodes collection.
Definition: hash.h:228
int32_t drift
The maximum drift to allow when matching hashes.
Definition: hash.h:261
Device detection data set structure which contains the 'must have's for all device detection data set...
Definition: dataset-dd.h:51
fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedConfig
Uses caching to balance memory usage and performance.
Definition: hash.h:420
fiftyoneDegreesCollectionConfig components
Components collection config.
Definition: hash.h:245
fiftyoneDegreesCollection * rootNodes
Collection of all root nodes.
Definition: hash.h:309
uint32_t performanceNodeOffset
Offset in the nodes collection of the root node for the performance graph.
Definition: hash.h:279
Data structure containing the root nodes for the combination of an evidence item and a component.
Definition: hash.h:278
Singular User-Agent result returned by a Hash process method.
Definition: hash.h:325
Collection header structure which defines the size and location of the collection data.
Definition: collection.h:277
fiftyoneDegreesStatusCode
Status returned from the initialisation of a resource.
Definition: status.h:82
fiftyoneDegreesCollectionConfig properties
Properties collection config.
Definition: hash.h:248
const int32_t versionMinor
Minor version of the data file loaded.
Definition: hash.h:194
fiftyoneDegreesCollection * maps
Collection data file maps.
Definition: hash.h:305
fiftyoneDegreesStatusCode fiftyoneDegreesHashInitManagerFromFile(fiftyoneDegreesResourceManager *manager, fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, const char *fileName, fiftyoneDegreesException *exception)
Initialises the resource manager with a Hash data set resource populated from the Hash data file refe...
fiftyoneDegreesStatusCode fiftyoneDegreesHashReloadManagerFromMemory(fiftyoneDegreesResourceManager *manager, void *source, long length, fiftyoneDegreesException *exception)
Reload the data set being used by the resource manager using a data file loaded into contiguous memor...
const char * fiftyoneDegreesResultsHashGetNoValueReasonMessage(fiftyoneDegreesResultsNoValueReason reason)
Gets a fuller description of the reason why a value is missing.
char * fiftyoneDegreesHashGetDeviceIdFromResult(fiftyoneDegreesDataSetHash *dataSet, fiftyoneDegreesResultHash *result, char *destination, size_t size, fiftyoneDegreesException *exception)
Get the device id string from the single result provided.
fiftyoneDegreesResultUserAgent b
Base User-Agent result.
Definition: hash.h:326
uint32_t * profileOffsets
Array of profile offsets where the index is the component index.
Definition: hash.h:327
void fiftyoneDegreesResultsHashFree(fiftyoneDegreesResultsHash *results)
Frees the results structure created by the fiftyoneDegreesResultsHashCreate method.
fiftyoneDegreesCollectionConfig nodes
Nodes collection config.
Definition: hash.h:254
fiftyoneDegreesResultsNoValueReason fiftyoneDegreesResultsHashGetNoValueReason(fiftyoneDegreesResultsHash *results, int requiredPropertyIndex, fiftyoneDegreesException *exception)
Gets the reason why a results does not contain valid values for a given property.
uint32_t fiftyoneDegreesHashIterateProfilesForPropertyAndValue(fiftyoneDegreesResourceManager *manager, const char *propertyName, const char *valueName, void *state, fiftyoneDegreesProfileIterateMethod callback, fiftyoneDegreesException *exception)
Iterates over the profiles in the data set calling the callback method for any profiles that contain ...
size_t fiftyoneDegreesHashSizeManagerFromMemory(fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, void *memory, long size, fiftyoneDegreesException *exception)
Gets the total size in bytes which will be allocated when intialising a Hash resource and associated ...
Used to store a handle to the underlying item that could be used to release the item when it's finish...
Definition: collection.h:309
size_t fiftyoneDegreesHashSizeManagerFromFile(fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, const char *fileName, fiftyoneDegreesException *exception)
EXTERNAL METHODS.
fiftyoneDegreesCollectionItem * fiftyoneDegreesResultsHashGetValues(fiftyoneDegreesResultsHash *results, int requiredPropertyIndex, fiftyoneDegreesException *exception)
Populates the list of values in the results instance with value structure instances associated with t...
const fiftyoneDegreesDataSetHashHeader header
Dataset header.
Definition: hash.h:296
fiftyoneDegreesCollection * strings
Collection of all strings.
Definition: hash.h:298
void fiftyoneDegreesResultsHashFromEvidence(fiftyoneDegreesResultsHash *results, fiftyoneDegreesEvidenceKeyValuePairArray *evidence, fiftyoneDegreesException *exception)
Processes the evidence value pairs in the evidence collection and populates the result in the results...
fiftyoneDegreesConfigHash fiftyoneDegreesHashDefaultConfig
Default detection configuration.
Definition: hash.h:441
bool usePerformanceGraph
True if the performance optimized graph should be used for processing.
Definition: hash.h:264
bool * profileIsOverriden
Array of boolean flags indicating whether the result profile offset at the same index is one which ha...
Definition: hash.h:329
const int32_t versionMajor
Major version of the data file loaded.
Definition: hash.h:193
Used to store the date when the dataset was produced and next date 51Degrees expect to provide a new ...
Definition: date.h:58
const fiftyoneDegreesDate nextUpdate
Date when the next data file will be available.
Definition: hash.h:211
size_t fiftyoneDegreesResultsHashGetValuesString(fiftyoneDegreesResultsHash *results, const char *propertyName, char *buffer, size_t bufferLength, const char *separator, fiftyoneDegreesException *exception)
Sets the buffer the values associated in the results for the property name.
bool usePredictiveGraph
True if the predictive optimized graph should be used for processing.
Definition: hash.h:266
const fiftyoneDegreesCollectionHeader rootNodes
Root nodes which point to the start of each graph used in detection.
Definition: hash.h:225
const int32_t versionBuild
Build version of the data file loaded.
Definition: hash.h:195
fiftyoneDegreesCollection * components
Collection of all components.
Definition: hash.h:299
Array of items of type fiftyoneDegreesResultHash used to easily access and track the size of the arra...
Definition: hash.h:364
bool fiftyoneDegreesResultsHashGetHasValues(fiftyoneDegreesResultsHash *results, int requiredPropertyIndex, fiftyoneDegreesException *exception)
Gets whether or not the results provided contain valid values for the property index provided.
fiftyoneDegreesCollection * values
Collection of all values.
Definition: hash.h:307
const int16_t age
Age of the data set format.
Definition: hash.h:202
const fiftyoneDegreesConfigHash config
Copy of the configuration.
Definition: hash.h:297
const fiftyoneDegreesCollectionHeader profiles
Size and location of the profiles collection.
Definition: hash.h:223
fiftyoneDegreesCollectionConfig profiles
Profiles collection config.
Definition: hash.h:251
int32_t matchedNodes
The number of hashes matched in the User-Agent.
Definition: hash.h:340
fiftyoneDegreesCollection * nodes
Collection of all hash nodes.
Definition: hash.h:310
Data set structure containing all the components used for detections.
Definition: hash.h:294
char * fiftyoneDegreesHashGetDeviceIdFromResults(fiftyoneDegreesResultsHash *results, char *destination, size_t size, fiftyoneDegreesException *exception)
Get the device id string from the results provided.
fiftyoneDegreesConfigHash fiftyoneDegreesHashLowMemoryConfig
Low memory configuration.
Definition: hash.h:406
fiftyoneDegreesHashMatchMethod
DATA STRUCTURES.
Definition: hash.h:182
void fiftyoneDegreesResultsHashFromDeviceId(fiftyoneDegreesResultsHash *results, const char *deviceId, size_t deviceIdLength, fiftyoneDegreesException *exception)
Process a single Device Id and populate the device offsets in the results structure.
const fiftyoneDegreesCollectionHeader properties
Size and location of the properties collection.
Definition: hash.h:219
fiftyoneDegreesConfigHash fiftyoneDegreesHashSingleLoadedConfig
Configuration designed only for testing.
Definition: hash.h:449
const fiftyoneDegreesCollectionHeader components
Size and location of the components collection.
Definition: hash.h:215
fiftyoneDegreesDataSetDeviceDetection b
Base data set.
Definition: hash.h:295
fiftyoneDegreesCollectionConfig values
Values collection config.
Definition: hash.h:250
const fiftyoneDegreesCollectionHeader profileOffsets
Size and location of the profile offsets collection.
Definition: hash.h:230
void fiftyoneDegreesDataSetHashRelease(fiftyoneDegreesDataSetHash *dataSet)
Release the reference to a data set returned by the fiftyoneDegreesDataSetHashGet method.
fiftyoneDegreesConfigHash fiftyoneDegreesHashHighPerformanceConfig
Highest performance configuration.
Definition: hash.h:393
fiftyoneDegreesStatusCode fiftyoneDegreesHashInitManagerFromMemory(fiftyoneDegreesResourceManager *manager, fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, void *memory, long size, fiftyoneDegreesException *exception)
Initialises the resource manager with a Hash data set resource populated from the Hash data set point...
fiftyoneDegreesResultsNoValueReason
Enum containing reasons which cause a value to not be present or valid.
Definition: results.h:61
fiftyoneDegreesStatusCode fiftyoneDegreesHashReloadManagerFromFile(fiftyoneDegreesResourceManager *manager, const char *fileName, fiftyoneDegreesException *exception)
Reload the data set being used by the resource manager using the data file location specified.
fiftyoneDegreesCollection * profiles
Collection of all profiles.
Definition: hash.h:308
const fiftyoneDegreesDate published
Date when the data file was published.
Definition: hash.h:209
const fiftyoneDegreesCollectionHeader maps
Size and location of the maps collection.
Definition: hash.h:217
Singular User-Agent result returned by a device detection process method.
Definition: results-dd.h:49
fiftyoneDegreesCollectionConfig maps
Maps collection config.
Definition: hash.h:247
List structure which contains a list of collection items.
Definition: list.h:117
fiftyoneDegreesCollectionConfig strings
Strings collection config.
Definition: hash.h:244
Defines a set of properties which are required by a caller.
Definition: properties.h:180
fiftyoneDegreesDataSetHash * fiftyoneDegreesDataSetHashGet(fiftyoneDegreesResourceManager *manager)
Gets a safe reference to the Hash data set from the resource manager.
Array of items of type fiftyoneDegreesEvidenceKeyValuePair used to easily access and track the size o...
Definition: evidence.h:177
const int32_t formatOffset
Offset of the data file format in the strings collection.
Definition: hash.h:207
Manager structure used to provide access to a shared and changing resource.
Definition: resource.h:178
Collection configuration structure which defines how the collection should be created by the create m...
Definition: collection.h:288
int32_t iterations
Number of iterations required to get the device offset.
Definition: hash.h:334
const fiftyoneDegreesCollectionHeader strings
Size and location of the strings collection.
Definition: hash.h:213
int32_t difference
The maximum difference to allow when matching hashes.
Definition: hash.h:257
void fiftyoneDegreesResultsHashFromUserAgent(fiftyoneDegreesResultsHash *results, const char *userAgent, size_t userAgentLength, fiftyoneDegreesException *exception)
Process a single User-Agent and populate the device offsets in the results structure.
fiftyoneDegreesCollection * profileOffsets
Collection of all offsets to profiles in the profiles collection.
Definition: hash.h:311
Dataset header containing information about the dataset.
Definition: hash.h:192
Structure used to represent a 51Degrees exception and passed into methods that might generate excepti...
Definition: exceptions.h:116
fiftyoneDegreesConfigHash fiftyoneDegreesHashInMemoryConfig
DETECTION CONFIGURATIONS.
Definition: hash.h:383
fiftyoneDegreesConfigDeviceDetection b
Base configuration.
Definition: hash.h:243
Hash specific configuration structure.
Definition: hash.h:242
fiftyoneDegreesCollectionConfig rootNodes
Root nodes collection config.
Definition: hash.h:252
const int32_t copyrightOffset
Offset of the copyright string in the strings collection.
Definition: hash.h:200
const int32_t minUserAgentCount
Minimum count for a User-Agent to be included in the data file export.
Definition: hash.h:203
fiftyoneDegreesHashMatchMethod method
The method used to provide the match result.
Definition: hash.h:332
const fiftyoneDegreesCollectionHeader values
Size and location of the values collection.
Definition: hash.h:221
Trace node structure used to trace the route taken when evaluating a graph.
Definition: graph.h:143
fiftyoneDegreesList componentsList
List of component items from the components collection.
Definition: hash.h:300
fiftyoneDegreesCollectionConfig profileOffsets
Profile offsets collection config.
Definition: hash.h:255
Device detection configuration structure containing device detection specific configuration options,...
Definition: config-dd.h:52
bool traceRoute
True if the route through each graph should be traced during processing.
Definition: hash.h:268
fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedTempConfig
Balanced configuration modified to create a temporary file copy of the source data file to avoid lock...
Definition: hash.h:430
int32_t drift
The maximum drift for a matched substring from the character position where it was expected to be fou...
Definition: hash.h:338
bool * componentsAvailable
Array of flags indicating if there are any properties available for the component with the matching i...
Definition: hash.h:302
bool(* fiftyoneDegreesProfileIterateMethod)(void *state, fiftyoneDegreesCollectionItem *item)
Definition of a callback function which is passed an item of a type determined by the iteration metho...
Definition: profile.h:121
fiftyoneDegreesStatusCode fiftyoneDegreesHashReloadManagerFromOriginalFile(fiftyoneDegreesResourceManager *manager, fiftyoneDegreesException *exception)
Reload the data set being used by the resource manager using the data file location which was used wh...
const int32_t versionRevision
Revision version of the data file loaded.
Definition: hash.h:196
const int32_t nameOffset
Offset of the data file name in the strings collection.
Definition: hash.h:205
size_t fiftyoneDegreesResultsHashGetValuesStringByRequiredPropertyIndex(fiftyoneDegreesResultsHash *results, const int requiredPropertyIndex, char *buffer, size_t bufferLength, const char *separator, fiftyoneDegreesException *exception)
Sets the buffer the values associated in the results for the property name.
All the shared methods and fields required by file, memory and cached collections.
Definition: collection.h:409
fiftyoneDegreesResultsHash * fiftyoneDegreesResultsHashCreate(fiftyoneDegreesResourceManager *manager, uint32_t userAgentCapacity, uint32_t overridesCapacity)
Allocates a results structure containing a reference to the Hash data set managed by the resource man...
fiftyoneDegreesGraphTraceNode * trace
The graph trace constructed during processing if the option was enabled (and the executable was compi...
Definition: hash.h:341
int32_t difference
The total difference in hash code values between the matched substring and the actual substring.
Definition: hash.h:336
The length of the enum.
Definition: hash.h:187
#define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS
Macro defining the common members of a Hash result.
Definition: hash.h:352
fiftyoneDegreesCollection * properties
Collection of all properties.
Definition: hash.h:306