наименьшее значение функции hash ()? - PullRequest
1 голос
/ 25 октября 2010

в python (3), какое наименьшее значение может вернуть hash(x)?

Я хочу использовать хэши, чтобы быстро «дактилоскопировать» значения базы данных (в основном, это позволяет легко увидеть, равны ли два длинных одинаковых текста на самом деле или нет), и хочу избавиться от отрицательных чисел (для простоты), поэтому я подумал, что просто добавлю наименьшее возможное значение, чтобы получить значения от нуля и выше. руководство очень полезно заявляет, что "значения хеша являются целыми числами".это примерно столько, сколько я знал раньше.

Я был немного удивлен сегодня, когда обнаружил, что мой скомпилированный вручную Python на 64-битной Ubuntu, очевидно, использует 64-битные или около того для своей функции хеширования;я всегда думал, что это должно быть 32 бита.Влияет ли архитектура машины на функцию hash()?

также, когда я компилировал python, я не установил никакой опции для компиляции для 64-битной архитектуры (надеясь, что это «просто сработает»).Python настраивает это сам или у меня теперь есть 32-битный Python на 64-битной машине?Я не думаю, что это глупый вопрос, поскольку вам часто предлагают отдельные пакеты в зависимости от процессора.

edit : я сильно подозреваю, что ответ будет тесно связан с sys.maxint, к сожалению,Удалено из Python 3. Я подозреваю, что я должен def xhash( x ): return hash( x ) - ( -maxint - 1 ), если maxint был доступен.я знаю, что это значение «потеряло свою ценность» из-за объединения целых и длинных, но здесь может быть одна область, в которой оно все еще может оказаться полезным.У кого-нибудь есть идеи, как реализовать аналог?

Ответы [ 4 ]

5 голосов
/ 25 октября 2010

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

Так, например, вы можете решить, что хотите использовать 8-значный хэш, и получитьиспользуя:

hash(x) % 100000000

Или вы можете получить восьмибуквенный алфавитно-цифровой хеш для отображения:

md5(hash(x)).hexdigest()[:8]
4 голосов
/ 25 октября 2010
Хэш-функции

обычно используют полный диапазон возвращаемого значения.Причина в том, что они обычно создаются с помощью битовых операций (сдвиг, ксоринг и т. Д.) - все биты возвращаемого значения используются во время алгоритма.

Почему положительные значения легче или сложнее отрицательных?

1 голос
/ 25 октября 2010

так что сегодня мне повезло в казино Google, и вот что я нашел:

(1) архитектура системы , может ли данный питон работать на 64 или 32-битной машине, узнать по

from platform import architecture
print( architecture() )

из документации: «Запрашивает данный исполняемый файл (по умолчанию двоичный файл интерпретатора Python) для получения различной информации об архитектуре. Возвращает кортеж (биты, связь), который содержит информацию об архитектуре битов и формате связи, используемом для исполняемого файла. Оба значения возвращаются в виде строк. " на моей машине это ('64bit', 'ELF'). лото.

(2) наименьшее целое число в python 3 больше нет sys.maxint, но есть sys.maxsize. в документах сказано: «Целое число, дающее максимальное значение, которое может принимать переменная типа Py_ssize_t. Обычно это 2**31 - 1 на 32-битной платформе и 2**63 - 1 на 64-битной платформе». следовательно,

from sys import maxsize
assert maxsize == 2**63 - 1

работает на моей машине.

(3) для прямого ответа на исходный вопрос: «Наименьшее значение функции hash() должно быть минус независимо от того, что sys.maxsize сообщает. По этой причине можно ожидать, что

def xhash( x ): return hash( x ) + sys.maxsize + 1

будет сообщать только значения ≥ 0. "

1 голос
/ 25 октября 2010

Ответ на ваш вопрос должен быть:

assert(hash(100) == 100 and hash(-100) == -100)
smallest_hash_value= -2**min(range(256), key=lambda i: hash(-2**i))

Это зависит от того факта, что Python использует само целое число в качестве хэша (за исключением -1), если целое число является действительным hash() результат.Алгоритм обычно должен оставаться неизменным независимо от архитектуры.

...