Самый быстрый способ хэширования набора GUID - PullRequest
2 голосов
/ 14 ноября 2008

У меня есть список из n GUID, и мне нужно их хэшировать в одно значение. Это значение может быть размером объекта Guid или размером Int32, на самом деле это не имеет значения, но оно должно быть статистически уникальным (скажем, с вероятностью, похожей на MD5).

Таким образом, одним из подходов может быть их сортировка, объединение байтов и получение MD5-хеша всех байтов ... но это не очень быстро.

Другая идея: я заметил, что в .NET является довольно стандартной практикой реализации метода GetHashCode для составного объекта в качестве XOR хеш-кодов составных объектов. Следовательно, может ли это быть математически разумно для XOR моего списка GUID?

Любые идеи приветствуются!

Ответы [ 2 ]

2 голосов
/ 14 ноября 2008

Если вы хотите, чтобы хэш был действительным для набора (т.е. порядок не имеет значения), тогда XORing хеш-кода каждого GUID является хорошим выбором.

Если у вас на самом деле есть последовательность идентификаторов GUID и порядок имеет значение, то я бы предложил использовать тот же подход, который я написал о в другом ответе - многократно добавлять / умножать.

(Обратите внимание, что XOR при использовании хеш-кодов, вероятно, не даст вам того же ответа, что и XOR самих GUID, а затем хэширует результат. Возможно, но это зависит от реализации GUID.GetHashCode (). Я бы хэшировал каждое значение и XOR результаты вместе - кроме всего прочего, это тривиально реализовать.)

0 голосов
/ 14 ноября 2008

Не XOR GUID, а затем хэшируйте результат. Вы ничего не получите таким образом, просто XOR GUIDs, если вы не используете хеш меньше GUID.

Поскольку вы, похоже, действительно заботитесь о производительности для этого, было бы полезно немного больше информации - в частности, используете ли вы разные комбинации идентификаторов GUID, которые есть в памяти (чтобы вы могли их хешировать только один раз, поскольку они создан), или вы загружаете их и обрабатываете их, и повторные идентификаторы GUID маловероятны?

...