J'ai les structures suivantes définies (les noms sont anonymisées, mais les types de données sont correctes):Quelle est la meilleure façon de hacher cette structure complexe dans VB6?
Public Type ExampleDataItem
Limit As Integer ' could be any value 0-999
Status As Integer ' could be any value 0-2
ValidUntil As Date ' always a valid date
End Type
Public Type ExampleData
Name As String ' could be 5-20 chars long
ValidOn As Date ' could be valid date or 1899-12-30 representing "null"
Salt As Integer ' random value 42-32767
Items(0 To 13) As ExampleDataItem
End Type
Je voudrais générer un code de hachage 32 bits pour une instance ExampleData
. La minimisation des collisions de hachage est importante, la performance et l'ordre des données n'est pas important.
Jusqu'à présent, j'ai obtenu (en pseudocode):
- serialise tous les membres dans un tableau d'octets.
- Parcourez le tableau d'octets en lisant 4 octets à la fois dans une valeur
Long
. - XOR toutes les valeurs
Long
ensemble.
Je ne peux pas vraiment publier mon code, car il dépend fortement des classes d'utilitaires pour effectuer la sérialisation, mais si quelqu'un veut le voir, je le publierai.
Est-ce que ce sera OK, ou quelqu'un peut-il suggérer une meilleure façon de le faire?
EDIT:
Ce code est utilisé pour mettre en œuvre une partie d'un système de licences de logiciels. Le but du hachage est de confirmer si les données entrées par l'utilisateur final sont égales aux données saisies par le technicien de support technique. Le hachage doit donc:
- Soyez très court. C'est pourquoi j'ai pensé que 32 bits seraient les plus appropriés, car ils peuvent être affichés sous la forme d'un nombre décimal à 10 chiffres à l'écran. C'est facile, rapide et sans ambiguïté à lire sur le téléphone et tapez.
- DERIVENT de tous les champs dans la structure de données, sans clés supplémentaires artificiels ou tout autre supercherie.
Le hachage n'est pas nécessaire pour la recherche, le test unique, ou pour stocker ExampleData
cas dans tout type de collection, mais seulement pour un but décrit ci-dessus.
Les valeurs de hachage sont utilisées pour accélérer la recherche de données. Si la performance n'est pas un problème, pourquoi voulez-vous le surcoût ajouté? –
Aha! L'édition rend la question beaucoup plus claire. Vous essayez de détecter les petites erreurs de frappe, pas de minimiser les collisions entre des données totalement différentes. Dans ce cas, le CRC devrait être parfait. – MarkJ