\r\n

51Degrees Device Detection C/C++  4.4

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 2023 51 Degrees Mobile Experts Limited, Davidson House,
4  * Forbury Square, Reading, Berkshire, United Kingdom RG1 3EU.
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
13  * (EUPL) 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/common.h"
59 #include "../common-cxx/data.h"
60 #include "../common-cxx/exceptions.h"
61 #include "../common-cxx/threading.h"
62 #include "../common-cxx/file.h"
63 #include "../common-cxx/collection.h"
64 #include "../common-cxx/evidence.h"
65 #include "../common-cxx/list.h"
66 #include "../common-cxx/resource.h"
67 #include "../common-cxx/properties.h"
68 #include "../common-cxx/status.h"
69 #include "../common-cxx/date.h"
70 #include "../common-cxx/pool.h"
71 #include "../common-cxx/component.h"
72 #include "../common-cxx/property.h"
73 #include "../common-cxx/value.h"
74 #include "../common-cxx/profile.h"
75 #include "../common-cxx/overrides.h"
76 #include "../config-dd.h"
77 #include "../dataset-dd.h"
78 #include "../results-dd.h"
79 #include "graph.h"
80 
82 #ifndef FIFTYONE_DEGREES_CACHE_CONCURRENCY
83 #ifndef FIFTYONE_DEGREES_NO_THREADING
84 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 10
85 #else
86 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 1
87 #endif
88 #endif
89 
93 #ifndef FIFTYONE_DEGREES_HASH_DIFFERENCE
94 #define FIFTYONE_DEGREES_HASH_DIFFERENCE 0
95 #endif
96 
100 #ifndef FIFTYONE_DEGREES_HASH_DRIFT
101 #define FIFTYONE_DEGREES_HASH_DRIFT 0
102 #endif
103 
108 #ifndef FIFTYONE_DEGREES_STRING_CACHE_SIZE
109 #define FIFTYONE_DEGREES_STRING_CACHE_SIZE 10000
110 #endif
111 
115 #ifndef FIFTYONE_DEGREES_STRING_LOADED
116 #define FIFTYONE_DEGREES_STRING_LOADED 100
117 #endif
118 
122 #ifndef FIFTYONE_DEGREES_NODE_CACHE_SIZE
123 #define FIFTYONE_DEGREES_NODE_CACHE_SIZE 50000
124 #endif
125 
129 #ifndef FIFTYONE_DEGREES_NODE_LOADED
130 #define FIFTYONE_DEGREES_NODE_LOADED 100
131 #endif
132 
136 #ifndef FIFTYONE_DEGREES_PROFILE_CACHE_SIZE
137 #define FIFTYONE_DEGREES_PROFILE_CACHE_SIZE 10000
138 #endif
139 
143 #ifndef FIFTYONE_DEGREES_PROFILE_LOADED
144 #define FIFTYONE_DEGREES_PROFILE_LOADED 100
145 #endif
146 
150 #ifndef FIFTYONE_DEGREES_VALUE_CACHE_SIZE
151 #define FIFTYONE_DEGREES_VALUE_CACHE_SIZE 500
152 #endif
153 
157 #ifndef FIFTYONE_DEGREES_VALUE_LOADED
158 #define FIFTYONE_DEGREES_VALUE_LOADED 0
159 #endif
160 
164 #ifndef FIFTYONE_DEGREES_PROPERTY_CACHE_SIZE
165 #define FIFTYONE_DEGREES_PROPERTY_CACHE_SIZE 0
166 #endif
167 
171 #ifndef FIFTYONE_DEGREES_PROPERTY_LOADED
172 #define FIFTYONE_DEGREES_PROPERTY_LOADED INT_MAX
173 #endif
174 
183 typedef enum e_fiftyone_degrees_hash_match_method {
184  FIFTYONE_DEGREES_HASH_MATCH_METHOD_NONE,
185  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PERFORMANCE,
186  FIFTYONE_DEGREES_HASH_MATCH_METHOD_COMBINED,
187  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PREDICTIVE,
190 
192 #pragma pack(push, 1)
193 typedef struct fiftyoneDegrees_hash_dataset_header_t {
194  const int32_t versionMajor;
195  const int32_t versionMinor;
196  const int32_t versionBuild;
197  const int32_t versionRevision;
199  const byte tag[16];
200  const byte exportTag[16];
201  const int32_t copyrightOffset;
203  const int16_t age;
204  const int32_t minUserAgentCount;
206  const int32_t nameOffset;
208  const int32_t formatOffset;
236 #pragma pack(pop)
237 
243 typedef struct fiftyone_degrees_config_hash_t {
258  int32_t difference;
262  int32_t drift;
269  bool traceRoute;
274 
279 typedef struct fiftyone_degrees_hash_rootnodes_t {
285 
295 typedef struct fiftyone_degrees_dataset_hash_t {
316 
318 typedef struct fiftyone_degrees_result_hash_t fiftyoneDegreesResultHash;
326 typedef struct fiftyone_degrees_result_hash_t {
328  uint32_t *profileOffsets;
335  int32_t iterations;
337  int32_t difference;
339  int32_t drift;
341  int32_t matchedNodes;
349 
353 #define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS \
354  fiftyoneDegreesResultsDeviceDetection b; \
355  fiftyoneDegreesCollectionItem propertyItem; \
357  fiftyoneDegreesList values; \
359  fiftyoneDegreesEvidenceKeyValuePairArray* pseudoEvidence;
362 FIFTYONE_DEGREES_ARRAY_TYPE(
475  const char *fileName,
476  fiftyoneDegreesException *exception);
477 
502  const char *fileName,
503  fiftyoneDegreesException *exception);
504 
525  void *memory,
526  long size,
527  fiftyoneDegreesException *exception);
528 
552  void *memory,
553  long size,
554  fiftyoneDegreesException *exception);
555 
578  fiftyoneDegreesException *exception);
579 
591  const char* userAgent,
592  size_t userAgentLength,
593  fiftyoneDegreesException *exception);
594 
606  const char* deviceId,
607  size_t deviceIdLength,
608  fiftyoneDegreesException *exception);
609 
625  uint32_t userAgentCapacity,
626  uint32_t overridesCapacity);
627 
634 EXTERNAL void fiftyoneDegreesResultsHashFree(
635  fiftyoneDegreesResultsHash* results);
636 
650  int requiredPropertyIndex,
651  fiftyoneDegreesException *exception);
652 
666  int requiredPropertyIndex,
667  fiftyoneDegreesException *exception);
668 
676 
692  int requiredPropertyIndex,
693  fiftyoneDegreesException *exception);
694 
709  const char *propertyName,
710  char *buffer,
711  size_t bufferLength,
712  const char *separator,
713  fiftyoneDegreesException *exception);
714 
727 EXTERNAL size_t
730  const int requiredPropertyIndex,
731  char *buffer,
732  size_t bufferLength,
733  const char *separator,
734  fiftyoneDegreesException *exception);
735 
756  fiftyoneDegreesException *exception);
757 
779  const char *fileName,
780  fiftyoneDegreesException *exception);
781 
805  void *source,
806  long length,
807  fiftyoneDegreesException *exception);
808 
821 
829  fiftyoneDegreesDataSetHash *dataSet);
830 
831 
847  const char *propertyName,
848  const char *valueName,
849  void *state,
851  fiftyoneDegreesException *exception);
852 
868  char *destination,
869  size_t size,
870  fiftyoneDegreesException *exception);
871 
884  char *destination,
885  size_t size,
886  fiftyoneDegreesException *exception);
887 
892 #endif
uint32_t predictiveNodeOffset
Offset in the nodes collection of the root node for the predictive graph.
Definition: hash.h:282
const fiftyoneDegreesCollectionHeader nodes
Size and location of the nodes collection.
Definition: hash.h:229
int32_t drift
The maximum drift to allow when matching hashes.
Definition: hash.h:262
Device detection data set structure which contains the 'must have's for all device detection data set...
Definition: dataset-dd.h:51
fiftyoneDegreesCollectionConfig components
Components collection config.
Definition: hash.h:246
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedConfig
Uses caching to balance memory usage and performance.
Definition: hash.h:421
fiftyoneDegreesCollection * rootNodes
Collection of all root nodes.
Definition: hash.h:310
uint32_t performanceNodeOffset
Offset in the nodes collection of the root node for the performance graph.
Definition: hash.h:280
Data structure containing the root nodes for the combination of an evidence item and a component.
Definition: hash.h:279
Singular User-Agent result returned by a Hash process method.
Definition: hash.h:326
Collection header structure which defines the size and location of the collection data.
Definition: collection.h:276
fiftyoneDegreesStatusCode
Status returned from the initialisation of a resource.
Definition: status.h:77
fiftyoneDegreesCollectionConfig properties
Properties collection config.
Definition: hash.h:249
const int32_t versionMinor
Minor version of the data file loaded.
Definition: hash.h:195
fiftyoneDegreesCollection * maps
Collection data file maps.
Definition: hash.h:306
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.
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashInMemoryConfig
DETECTION CONFIGURATIONS.
Definition: hash.h:384
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:327
uint32_t * profileOffsets
Array of profile offsets where the index is the component index.
Definition: hash.h:328
void fiftyoneDegreesResultsHashFree(fiftyoneDegreesResultsHash *results)
Frees the results structure created by the fiftyoneDegreesResultsHashCreate method.
fiftyoneDegreesCollectionConfig nodes
Nodes collection config.
Definition: hash.h:255
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:308
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:297
fiftyoneDegreesCollection * strings
Collection of all strings.
Definition: hash.h:299
void fiftyoneDegreesResultsHashFromEvidence(fiftyoneDegreesResultsHash *results, fiftyoneDegreesEvidenceKeyValuePairArray *evidence, fiftyoneDegreesException *exception)
Processes the evidence value pairs in the evidence collection and populates the result in the results...
bool usePerformanceGraph
True if the performance optimized graph should be used for processing.
Definition: hash.h:265
bool * profileIsOverriden
Array of boolean flags indicating whether the result profile offset at the same index is one which ha...
Definition: hash.h:330
const int32_t versionMajor
Major version of the data file loaded.
Definition: hash.h:194
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:212
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashHighPerformanceConfig
Highest performance configuration.
Definition: hash.h:394
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:267
const fiftyoneDegreesCollectionHeader rootNodes
Root nodes which point to the start of each graph used in detection.
Definition: hash.h:226
const int32_t versionBuild
Build version of the data file loaded.
Definition: hash.h:196
fiftyoneDegreesCollection * components
Collection of all components.
Definition: hash.h:300
Array of items of type fiftyoneDegreesResultHash used to easily access and track the size of the arra...
Definition: hash.h:365
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:308
const int16_t age
Age of the data set format.
Definition: hash.h:203
const fiftyoneDegreesConfigHash config
Copy of the configuration.
Definition: hash.h:298
const fiftyoneDegreesCollectionHeader profiles
Size and location of the profiles collection.
Definition: hash.h:224
fiftyoneDegreesCollectionConfig profiles
Profiles collection config.
Definition: hash.h:252
int32_t matchedNodes
The number of hashes matched in the User-Agent.
Definition: hash.h:341
fiftyoneDegreesCollection * nodes
Collection of all hash nodes.
Definition: hash.h:311
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashDefaultConfig
Default detection configuration.
Definition: hash.h:442
Data set structure containing all the components used for detections.
Definition: hash.h:295
char * fiftyoneDegreesHashGetDeviceIdFromResults(fiftyoneDegreesResultsHash *results, char *destination, size_t size, fiftyoneDegreesException *exception)
Get the device id string from the results provided.
fiftyoneDegreesHashMatchMethod
DATA STRUCTURES.
Definition: hash.h:183
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.
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedTempConfig
Balanced configuration modified to create a temporary file copy of the source data file to avoid lock...
Definition: hash.h:431
const fiftyoneDegreesCollectionHeader properties
Size and location of the properties collection.
Definition: hash.h:220
const fiftyoneDegreesCollectionHeader components
Size and location of the components collection.
Definition: hash.h:216
fiftyoneDegreesDataSetDeviceDetection b
Base data set.
Definition: hash.h:296
fiftyoneDegreesCollectionConfig values
Values collection config.
Definition: hash.h:251
const fiftyoneDegreesCollectionHeader profileOffsets
Size and location of the profile offsets collection.
Definition: hash.h:231
void fiftyoneDegreesDataSetHashRelease(fiftyoneDegreesDataSetHash *dataSet)
Release the reference to a data set returned by the fiftyoneDegreesDataSetHashGet method.
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:56
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:309
const fiftyoneDegreesDate published
Date when the data file was published.
Definition: hash.h:210
const fiftyoneDegreesCollectionHeader maps
Size and location of the maps collection.
Definition: hash.h:218
Singular User-Agent result returned by a device detection process method.
Definition: results-dd.h:49
fiftyoneDegreesCollectionConfig maps
Maps collection config.
Definition: hash.h:248
List structure which contains a list of collection items.
Definition: list.h:112
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashLowMemoryConfig
Low memory configuration.
Definition: hash.h:407
fiftyoneDegreesCollectionConfig strings
Strings collection config.
Definition: hash.h:245
Defines a set of properties which are required by a caller.
Definition: properties.h:175
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:172
const int32_t formatOffset
Offset of the data file format in the strings collection.
Definition: hash.h:208
Manager structure used to provide access to a shared and changing resource.
Definition: resource.h:173
Collection configuration structure which defines how the collection should be created by the create m...
Definition: collection.h:287
int32_t iterations
Number of iterations required to get the device offset.
Definition: hash.h:335
const fiftyoneDegreesCollectionHeader strings
Size and location of the strings collection.
Definition: hash.h:214
int32_t difference
The maximum difference to allow when matching hashes.
Definition: hash.h:258
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:312
Dataset header containing information about the dataset.
Definition: hash.h:193
Structure used to represent a 51Degrees exception and passed into methods that might generate excepti...
Definition: exceptions.h:111
Definition: GettingStarted.c:63
fiftyoneDegreesConfigDeviceDetection b
Base configuration.
Definition: hash.h:244
Hash specific configuration structure.
Definition: hash.h:243
fiftyoneDegreesCollectionConfig rootNodes
Root nodes collection config.
Definition: hash.h:253
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashSingleLoadedConfig
Configuration designed only for testing.
Definition: hash.h:450
const int32_t copyrightOffset
Offset of the copyright string in the strings collection.
Definition: hash.h:201
const int32_t minUserAgentCount
Minimum count for a User-Agent to be included in the data file export.
Definition: hash.h:204
fiftyoneDegreesHashMatchMethod method
The method used to provide the match result.
Definition: hash.h:333
const fiftyoneDegreesCollectionHeader values
Size and location of the values collection.
Definition: hash.h:222
Trace node structure used to trace the route taken when evaluating a graph.
Definition: graph.h:144
fiftyoneDegreesList componentsList
List of component items from the components collection.
Definition: hash.h:301
fiftyoneDegreesCollectionConfig profileOffsets
Profile offsets collection config.
Definition: hash.h:256
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:269
int32_t drift
The maximum drift for a matched substring from the character position where it was expected to be fou...
Definition: hash.h:339
bool * componentsAvailable
Array of flags indicating if there are any properties available for the component with the matching i...
Definition: hash.h:303
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:116
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:197
const int32_t nameOffset
Offset of the data file name in the strings collection.
Definition: hash.h:206
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:408
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:342
int32_t difference
The total difference in hash code values between the matched substring and the actual substring.
Definition: hash.h:337
The length of the enum.
Definition: hash.h:188
#define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS
Macro defining the common members of a Hash result.
Definition: hash.h:353
fiftyoneDegreesCollection * properties
Collection of all properties.
Definition: hash.h:307