У меня определены следующие структуры (имена анонимны, но типы данных верны):
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
Я хотел бы сгенерировать 32-битный хэш-код для экземпляра ExampleData
. Важно минимизировать коллизии хешей, производительность и порядок данных не важны.
Пока у меня есть (в псевдокоде):
- Сериализация всех членов в один байтовый массив.
- Перебрать массив байтов, считывая 4 байта за раз в
Long
значение.
- XOR все значения
Long
вместе.
Я не могу опубликовать свой код, потому что он сильно зависит от служебных классов для выполнения сериализации, но если кто-то захочет увидеть его независимо от этого, я опубликую его.
Будет ли это нормально, или кто-нибудь может предложить лучший способ сделать это?
EDIT:
Этот код используется для реализации части системы лицензирования программного обеспечения. Цель хэша - подтвердить, совпадают ли данные, введенные конечным пользователем, с данными, введенными специалистом технической поддержки. Следовательно, хеш должен:
- Будь очень коротким. Вот почему я подумал, что 32 бита будут наиболее подходящими, потому что они могут быть представлены как 10-значное десятичное число на экране. Это легко, быстро и однозначно прочитать по телефону и набрать.
- Получается из всех полей в структуре данных, без каких-либо дополнительных искусственных ключей или других хитростей.
Хеш не требуется для поиска, тестирования уникальности или для хранения ExampleData
экземпляров в любом виде коллекции, но только для одной цели, описанной выше.