\r\n

51Degrees Device Detection C/C++  4.5

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 "../common-cxx/json.h"
77 
78 #include "../config-dd.h"
79 #include "../dataset-dd.h"
80 #include "../results-dd.h"
81 #include "graph.h"
82 
84 #ifndef FIFTYONE_DEGREES_CACHE_CONCURRENCY
85 #ifndef FIFTYONE_DEGREES_NO_THREADING
86 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 10
87 #else
88 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 1
89 #endif
90 #endif
91 
95 #ifndef FIFTYONE_DEGREES_EVIDENCE_HIGH_ENTROPY_VALUES
96 #define FIFTYONE_DEGREES_EVIDENCE_HIGH_ENTROPY_VALUES \
97  (FIFTYONE_DEGREES_COMMON_COOKIE_PREFIX \
98  "gethighentropyvalues")
99 #endif
100 
104 #ifndef FIFTYONE_DEGREES_EVIDENCE_STRUCTURED_USER_AGENT
105 #define FIFTYONE_DEGREES_EVIDENCE_STRUCTURED_USER_AGENT \
106  (FIFTYONE_DEGREES_COMMON_COOKIE_PREFIX \
107  "structureduseragent")
108 #endif
109 
113 #ifndef FIFTYONE_DEGREES_EVIDENCE_DEVICE_ID
114 #define FIFTYONE_DEGREES_EVIDENCE_DEVICE_ID \
115  (FIFTYONE_DEGREES_COMMON_COOKIE_PREFIX \
116  "deviceId")
117 #endif
118 
127 typedef enum e_fiftyone_degrees_hash_match_method {
128  FIFTYONE_DEGREES_HASH_MATCH_METHOD_NONE,
129  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PERFORMANCE,
130  FIFTYONE_DEGREES_HASH_MATCH_METHOD_COMBINED,
131  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PREDICTIVE,
134 
136 #pragma pack(push, 1)
137 typedef struct fiftyoneDegrees_hash_dataset_header_t {
138  const int32_t versionMajor;
139  const int32_t versionMinor;
140  const int32_t versionBuild;
141  const int32_t versionRevision;
143  const byte tag[16];
144  const byte exportTag[16];
145  const int32_t copyrightOffset;
147  const int16_t age;
148  const int32_t minUserAgentCount;
150  const int32_t nameOffset;
152  const int32_t formatOffset;
180 #pragma pack(pop)
181 
187 typedef struct fiftyone_degrees_config_hash_t {
202  int32_t difference;
206  int32_t drift;
213  bool traceRoute;
218 
223 typedef struct fiftyone_degrees_hash_rootnodes_t {
229 
239 typedef struct fiftyone_degrees_dataset_hash_t {
264 
266 typedef struct fiftyone_degrees_result_hash_t fiftyoneDegreesResultHash;
274 typedef struct fiftyone_degrees_result_hash_t {
276  uint32_t *profileOffsets;
283  int32_t iterations;
285  int32_t difference;
287  int32_t drift;
289  int32_t matchedNodes;
297 
301 #define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS \
302  fiftyoneDegreesResultsDeviceDetection b; \
303  fiftyoneDegreesCollectionItem propertyItem; \
305  fiftyoneDegreesList values;
308 FIFTYONE_DEGREES_ARRAY_TYPE(
413  const char *fileName,
414  fiftyoneDegreesException *exception);
415 
440  const char *fileName,
441  fiftyoneDegreesException *exception);
442 
463  void *memory,
464  long size,
465  fiftyoneDegreesException *exception);
466 
490  void *memory,
491  long size,
492  fiftyoneDegreesException *exception);
493 
516  fiftyoneDegreesException *exception);
517 
529  const char* userAgent,
530  size_t userAgentLength,
531  fiftyoneDegreesException *exception);
532 
545  const char* deviceId,
546  size_t deviceIdLength,
547  fiftyoneDegreesException *exception);
548 
563  uint32_t overridesCapacity);
564 
571 EXTERNAL void fiftyoneDegreesResultsHashFree(
572  fiftyoneDegreesResultsHash* results);
573 
587  int requiredPropertyIndex,
588  fiftyoneDegreesException *exception);
589 
603  int requiredPropertyIndex,
604  fiftyoneDegreesException *exception);
605 
613 
629  int requiredPropertyIndex,
630  fiftyoneDegreesException *exception);
631 
646  const char *propertyName,
647  char* const buffer,
648  size_t const length,
649  char* const separator,
650  fiftyoneDegreesException *exception);
651 
665  char* const buffer,
666  size_t const length,
667  fiftyoneDegreesException* exception);
668 
681 EXTERNAL size_t
684  const int requiredPropertyIndex,
685  char* const buffer,
686  size_t const length,
687  char* const separator,
688  fiftyoneDegreesException *exception);
689 
705  char* const buffer,
706  size_t const length,
707  char* const separator,
708  fiftyoneDegreesException* exception);
709 
730  fiftyoneDegreesException *exception);
731 
753  const char *fileName,
754  fiftyoneDegreesException *exception);
755 
779  void *source,
780  long length,
781  fiftyoneDegreesException *exception);
782 
795 
803  fiftyoneDegreesDataSetHash *dataSet);
804 
805 
821  const char *propertyName,
822  const char *valueName,
823  void *state,
825  fiftyoneDegreesException *exception);
826 
842  char* const buffer,
843  size_t const length,
844  fiftyoneDegreesException *exception);
845 
858  char* const buffer,
859  size_t const length,
860  fiftyoneDegreesException *exception);
861 
866 #endif
uint32_t predictiveNodeOffset
Offset in the nodes collection of the root node for the predictive graph.
Definition: hash.h:226
size_t fiftyoneDegreesResultsHashGetValuesStringAllProperties(fiftyoneDegreesResultsHash *results, char *const buffer, size_t const length, char *const separator, fiftyoneDegreesException *exception)
Sets the buffer the values associated in the results for all the available properties where each line...
const fiftyoneDegreesCollectionHeader nodes
Size and location of the nodes collection.
Definition: hash.h:173
int32_t drift
The maximum drift to allow when matching hashes.
Definition: hash.h:206
Device detection data set structure which contains the 'must have's for all device detection data set...
Definition: dataset-dd.h:52
fiftyoneDegreesCollectionConfig components
Components collection config.
Definition: hash.h:190
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedConfig
Uses caching to balance memory usage and performance.
Definition: hash.h:367
fiftyoneDegreesCollection * rootNodes
Collection of all root nodes.
Definition: hash.h:258
uint32_t performanceNodeOffset
Offset in the nodes collection of the root node for the performance graph.
Definition: hash.h:224
Data structure containing the root nodes for the combination of an evidence item and a component.
Definition: hash.h:223
Singular User-Agent result returned by a Hash process method.
Definition: hash.h:274
Collection header structure which defines the size and location of the collection data.
Definition: collection.h:278
fiftyoneDegreesStatusCode
Status returned from the initialisation of a resource.
Definition: status.h:77
fiftyoneDegreesCollectionConfig properties
Properties collection config.
Definition: hash.h:193
const int32_t versionMinor
Minor version of the data file loaded.
Definition: hash.h:139
fiftyoneDegreesCollection * maps
Collection data file maps.
Definition: hash.h:254
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:330
size_t fiftyoneDegreesResultsHashGetValuesStringByRequiredPropertyIndex(fiftyoneDegreesResultsHash *results, const int requiredPropertyIndex, char *const buffer, size_t const length, char *const separator, fiftyoneDegreesException *exception)
Sets the buffer the values associated in the results for the property name.
fiftyoneDegreesResultUserAgent b
Base User-Agent result.
Definition: hash.h:275
uint32_t * profileOffsets
Array of profile offsets where the index is the component index.
Definition: hash.h:276
void fiftyoneDegreesResultsHashFree(fiftyoneDegreesResultsHash *results)
Frees the results structure created by the fiftyoneDegreesResultsHashCreate method.
fiftyoneDegreesCollectionConfig nodes
Nodes collection config.
Definition: hash.h:199
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 ...
size_t fiftyoneDegreesResultsHashGetValuesString(fiftyoneDegreesResultsHash *results, const char *propertyName, char *const buffer, size_t const length, char *const separator, fiftyoneDegreesException *exception)
Sets the buffer the values associated in the results for the property name.
char * fiftyoneDegreesHashGetDeviceIdFromResult(fiftyoneDegreesDataSetHash *dataSet, fiftyoneDegreesResultHash *result, char *const buffer, size_t const length, fiftyoneDegreesException *exception)
Get the device id string from the single result provided.
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
char * fiftyoneDegreesHashGetDeviceIdFromResults(fiftyoneDegreesResultsHash *results, char *const buffer, size_t const length, fiftyoneDegreesException *exception)
Get the device id string from the results provided.
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:241
fiftyoneDegreesCollection * strings
Collection of all strings.
Definition: hash.h:243
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:209
bool * profileIsOverriden
Array of boolean flags indicating whether the result profile offset at the same index is one which ha...
Definition: hash.h:278
const int32_t versionMajor
Major version of the data file loaded.
Definition: hash.h:138
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:156
fiftyoneDegreesHeaderPtrs ** componentHeaders
Array of headers for each component index.
Definition: hash.h:247
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashHighPerformanceConfig
Highest performance configuration.
Definition: hash.h:340
bool usePredictiveGraph
True if the predictive optimized graph should be used for processing.
Definition: hash.h:211
const fiftyoneDegreesCollectionHeader rootNodes
Root nodes which point to the start of each graph used in detection.
Definition: hash.h:170
const int32_t versionBuild
Build version of the data file loaded.
Definition: hash.h:140
fiftyoneDegreesCollection * components
Collection of all components.
Definition: hash.h:244
Array of items of type fiftyoneDegreesResultHash used to easily access and track the size of the arra...
Definition: hash.h:311
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:256
const int16_t age
Age of the data set format.
Definition: hash.h:147
const fiftyoneDegreesConfigHash config
Copy of the configuration.
Definition: hash.h:242
const fiftyoneDegreesCollectionHeader profiles
Size and location of the profiles collection.
Definition: hash.h:168
fiftyoneDegreesCollectionConfig profiles
Profiles collection config.
Definition: hash.h:196
int32_t matchedNodes
The number of hashes matched in the User-Agent.
Definition: hash.h:289
fiftyoneDegreesCollection * nodes
Collection of all hash nodes.
Definition: hash.h:259
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashDefaultConfig
Default detection configuration.
Definition: hash.h:388
Data set structure containing all the components used for detections.
Definition: hash.h:239
uint32_t componentsAvailableCount
Number of components with properties.
Definition: hash.h:252
fiftyoneDegreesHashMatchMethod
DATA STRUCTURES.
Definition: hash.h:127
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedTempConfig
Balanced configuration modified to create a temporary file copy of the source data file to avoid lock...
Definition: hash.h:377
const fiftyoneDegreesCollectionHeader properties
Size and location of the properties collection.
Definition: hash.h:164
Array of header indexes.
Definition: headers.h:131
const fiftyoneDegreesCollectionHeader components
Size and location of the components collection.
Definition: hash.h:160
fiftyoneDegreesDataSetDeviceDetection b
Base data set.
Definition: hash.h:240
fiftyoneDegreesCollectionConfig values
Values collection config.
Definition: hash.h:195
const fiftyoneDegreesCollectionHeader profileOffsets
Size and location of the profile offsets collection.
Definition: hash.h:175
void fiftyoneDegreesDataSetHashRelease(fiftyoneDegreesDataSetHash *dataSet)
Release the reference to a data set returned by the fiftyoneDegreesDataSetHashGet method.
fiftyoneDegreesResultsHash * fiftyoneDegreesResultsHashCreate(fiftyoneDegreesResourceManager *manager, uint32_t overridesCapacity)
Allocates a results structure containing a reference to the Hash data set managed by the resource man...
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:257
size_t fiftyoneDegreesResultsHashGetValuesJson(fiftyoneDegreesResultsHash *results, char *const buffer, size_t const length, fiftyoneDegreesException *exception)
Sets the buffer to a JSON string that represents all the available properties and values in the resul...
const fiftyoneDegreesDate published
Date when the data file was published.
Definition: hash.h:154
const fiftyoneDegreesCollectionHeader maps
Size and location of the maps collection.
Definition: hash.h:162
Singular User-Agent result returned by a device detection process method.
Definition: results-dd.h:49
fiftyoneDegreesCollectionConfig maps
Maps collection config.
Definition: hash.h:192
List structure which contains a list of collection items.
Definition: list.h:112
EXTERNAL_VAR fiftyoneDegreesConfigHash fiftyoneDegreesHashLowMemoryConfig
Low memory configuration.
Definition: hash.h:353
fiftyoneDegreesCollectionConfig strings
Strings collection config.
Definition: hash.h:189
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 evidence key value pairs and a pointer to the next array if present or NULL of not present.
Definition: evidence.h:191
const int32_t formatOffset
Offset of the data file format in the strings collection.
Definition: hash.h:152
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:289
int32_t iterations
Number of iterations required to get the device offset.
Definition: hash.h:283
const fiftyoneDegreesCollectionHeader strings
Size and location of the strings collection.
Definition: hash.h:158
int32_t difference
The maximum difference to allow when matching hashes.
Definition: hash.h:202
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:260
Dataset header containing information about the dataset.
Definition: hash.h:137
Structure used to represent a 51Degrees exception and passed into methods that might generate excepti...
Definition: exceptions.h:111
int 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.
Definition: GettingStarted.c:64
fiftyoneDegreesConfigDeviceDetection b
Base configuration.
Definition: hash.h:188
Hash specific configuration structure.
Definition: hash.h:187
fiftyoneDegreesCollectionConfig rootNodes
Root nodes collection config.
Definition: hash.h:197
const int32_t copyrightOffset
Offset of the copyright string in the strings collection.
Definition: hash.h:145
const int32_t minUserAgentCount
Minimum count for a User-Agent to be included in the data file export.
Definition: hash.h:148
fiftyoneDegreesHashMatchMethod method
The method used to provide the match result.
Definition: hash.h:281
const fiftyoneDegreesCollectionHeader values
Size and location of the values collection.
Definition: hash.h:166
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:245
fiftyoneDegreesCollectionConfig profileOffsets
Profile offsets collection config.
Definition: hash.h:200
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:213
int32_t drift
The maximum drift for a matched substring from the character position where it was expected to be fou...
Definition: hash.h:287
bool * componentsAvailable
Array of flags indicating if there are any properties available for the component with the matching i...
Definition: hash.h:249
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:142
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:141
const int32_t nameOffset
Offset of the data file name in the strings collection.
Definition: hash.h:150
All the shared methods and fields required by file, memory and cached collections.
Definition: collection.h:402
fiftyoneDegreesGraphTraceNode * trace
The graph trace constructed during processing if the option was enabled (and the executable was compi...
Definition: hash.h:290
int32_t difference
The total difference in hash code values between the matched substring and the actual substring.
Definition: hash.h:285
The length of the enum.
Definition: hash.h:132
#define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS
Macro defining the common members of a Hash result.
Definition: hash.h:301
fiftyoneDegreesCollection * properties
Collection of all properties.
Definition: hash.h:255