2009-12-11 3 views
0

Я хочу, чтобы получить uniqe hash со всех объектов. Что еще, в случаеC# получение уникального хеша из всех объектов

Dictionary<string, MyObject> foo 

Я хочу, чтобы уникальные ключи для:

  • струнных
  • MyObject
  • Недвижимость в MyObject
  • Foo [someKey]
  • Foo

и т. Д.

объект.GetHashCode() не гарантирует уникальные возвращаемые значения для разных объектов. Вот что мне нужно.

Любая идея? Спасибо

+4

Это будет сложно. Возможно, но сложно и дорого в ресурсах. Можете ли вы четко объяснить, почему вы хотите такой механизм? Вероятно, есть лучший способ сделать то, что вы хотите. –

ответ

3

Проще говоря это невозможно. Функция GetHashCode возвращает целое число со знаком, которое содержит 2^32 возможных уникальных значения. На 64-битной платформе у вас может быть много более 2^32 разных объектов, и, следовательно, они не могут иметь уникальные хэш-коды.

Единственный способ приблизиться к этому - создать другую функцию хэширования, которая возвращает тип с емкостью, большей или равной количеству значений, которые могут быть созданы в текущей системе.

2

Уникальный хеш-код невозможен без ограничений на входном пространстве. Это связано с тем, что Object.GetHashCode является int. Если у вас более Int32.MaxValue объектов, то по крайней мере два из них должны сопоставляться с тем же хеш-кодом (по pigeonhole principle).

Определите пользовательский тип с ограниченным вводом (то есть количество возможных разных объектов до равенства меньше Int32.MaxValue), а затем, и только тогда можно создать уникальный хеш-код. Это не говорит, что это будет легко, просто возможно.

В качестве альтернативы, не используйте механизм Object.GetHashCode, а вместо этого другой способ представления хэшей, и вы, возможно, сможете делать то, что хотите. Нам нужна четкая информация о том, что вы хотите и используете, чтобы быть в состоянии помочь вам здесь.

4

«Уникальный хэш», как правило, является противоречием в терминах, даже в общих терминах (и это более очевидно невозможно, если вы пытаетесь использовать Int32 в качестве значения хэш-функции). Из записи Википедии:

Хэш-функция является любой хорошо определен процедура или математическая функция , которая преобразует большой, возможно переменного размера объем данных в небольшой опорной точки, как правило, одно целое число , что может служить в качестве индекса для массива . Значения, возвращаемые функцией хеша , называются хеш-значениями, хэш-кодом , хэш-суммами или просто хэшами.

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

Теперь, похоже, вы хотите, чтобы хеш был строкой ... что означает, что он не будет иметь фиксированный размер (но будет должен быть менее 2 ГБ или что бы ни ограничил). Самый простой способ создания этого «уникального хэша» - это сериализовать объект и преобразовать результат в строку, например. используя Base64, если это бинарный формат сериализации, или просто текст, если он основан на тексте, такой как JSON. Однако это не то, что кто-то еще действительно распознал бы как «хэширование».

+0

Хорошо, тогда я не сказал себя правильно. Это не хеширование. –

1

Как указывали другие, хеш-код никогда не будет уникальным, это не главное.

Цель состоит в том, чтобы помочь вашему Dictionary<string, MyObject> foo, чтобы найти точный экземпляр быстрее. Он будет использовать хеш-код, чтобы сузить поиск до меньшего набора объектов, а затем проверить их на равенство.

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

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