2008-11-14 3 views
2

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

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

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

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

ответ

2

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

Если вы на самом деле есть последовательность из GUIDs и вопросов порядка, то я предложил бы использовать тот же подход, который я написал о in another answer - неоднократно добавлять/размножаться.

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

+1

Рефлектор говорит, что реализация Guid.GetHashCode(): return ((this._a^((this._b << 0x10) | ((ushort) this._c)))^((this._f << 0x18) | this._k)); Интересно, что он не использует всю доступную информацию. Полагаю, поэтому XORing GUIDs даст более уникальный результат. – 2008-11-18 15:20:08

0

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

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

Смежные вопросы