Переменные хэши в python [duplicate]

Хотя ответ Чанга объясняет, как много раз рисовать на одном рисунке, в этом случае вам может быть лучше в этом случае с помощью groupby и unstack ing:

(Предположим, что у вас есть это в dataframe, с индексом datetime уже)

In [1]: df
Out[1]:
            value  
datetime                         
2010-01-01      1  
2010-02-01      1  
2009-01-01      1  

# create additional month and year columns for convenience
df['Month'] = map(lambda x: x.month, df.index)
df['Year'] = map(lambda x: x.year, df.index)    

In [5]: df.groupby(['Month','Year']).mean().unstack()
Out[5]:
       value      
Year    2009  2010
Month             
1          1     1
2        NaN     1

Теперь легко построить (каждый год как отдельная строка):

df.groupby(['Month','Year']).mean().unstack().plot()

30
задан smci 20 August 2017 в 20:48
поделиться

3 ответа

Python использует случайное хэш-семя, чтобы предотвратить атакующие из tar-pitting вашего приложения, отправив вам ключи, предназначенные для столкновения. См. Раскрытие оригинальной уязвимости . Смещая хэш с случайным семенем (установленным один раз при запуске), злоумышленники больше не могут предсказать, какие клавиши будут сталкиваться.

Вы можете установить фиксированное семя или отключить эту функцию, установив PYTHONHASHSEED переменная среды ; по умолчанию это random, но вы можете установить его на фиксированное положительное целочисленное значение, при этом 0 полностью отключит эту функцию.

В версиях версии 2.7 и 3.2 Python функция отключена по умолчанию (используйте -R или установите PYTHONHASHSEED=random, чтобы включить его); он включен по умолчанию в Python 3.3 и выше.

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

Также см. object.__hash__() специальная документация метода :

Примечание. По умолчанию значения __hash__() объектов str, bytes и datetime «соленые» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python. Это предназначено для обеспечения защиты от отказа в обслуживании, вызванного тщательно подобранными входами, которые используют наихудшую производительность при вложении dict, сложность O (n ^ 2). Подробнее см. В http://www.ocert.org/advisories/ocert-2011-003.html . Изменение значений хеша влияет на порядок итераций dicts, множеств и других сопоставлений. Python никогда не предоставлял гарантии об этом заказе (и обычно он варьируется между 32-битными и 64-битными сборками). См. Также PYTHONHASHSEED.

Если вам нужна стабильная реализация хэша, вы, вероятно, захотите посмотреть на модуль hashlib ; это реализует криптографические хэш-функции. Проект pybloom использует этот подход .

Поскольку смещение состоит из префикса и суффикса (начальное значение и конечное значение XORed, соответственно), вы не можете просто сохранить смещение, к сожалению. С положительной стороны это означает, что злоумышленники не могут легко определить смещение с тактическими атак.

48
ответ дан Community 16 August 2018 в 01:07
поделиться
  • 1
    Я ожидаю, что это появится в документах hash (), а не только в __hash __ (). +1 за отличный ответ. постскриптум Разве хелиб не является излишним для некриптографических применений хеш-функций? – redlus 18 December 2014 в 18:13
  • 2
    pybloom использует функции hashlib. Но если вы хотите что-то быстрее, вы можете проверить pyhash . – Håken Lid 21 December 2014 в 04:39
  • 3
    Почему документация вызывает его disable при установке его на 0? Я не вижу эффективной разницы, чтобы установить его на любое старое стабильное число семян, если только я чего-то не упускаю. Я имею в виду, когда я использую PYTHONHASHSEED=12345, я получаю один и тот же хэш для равных строк даже в сеансах - то же самое происходит, когда я использую PYTHONHASHSEED=0 - хэш для равных строк будет одинаковым во всех сеансах (хотя и отличается от 12345, но это очевидно, вот как работают семена). – blubberdiblub 13 April 2017 в 16:57
  • 4
    @blubberdiblub: с 0 нет никакого семени, а хеши для объектов равны тем, которые сгенерированы в старой версии Python без поддержки hashseed. – Martijn Pieters♦ 13 April 2017 в 17:59
  • 5
    @MartijnPieters, что означает, что для затронутых хэшей «нет семян вообще»? Каково семантическое или качественное отличие от наличия семени, скажем, 12345, кроме того, что он создает два разных набора сеансов, между которыми значения хэша различны, и кроме PYTHONHASHSEED = 0 равны более старым версиям? Можете ли вы связать меня с определенной частью исходного кода? Я предполагаю, что моя точка зрения состоит в том, что если такой разницы нет, я бы назвал это семером из 0 и более ранних версий Python, поддерживая только семя 0. Документация, поскольку она стоит прямо сейчас, довольно запутанна для меня. – blubberdiblub 14 April 2017 в 15:13

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

Вы можете увидеть детали на этой странице: https : //docs.python.org/3.3/library/functions.html#hash .

и hash () исходят из метода __hash__ объекта. Документ говорит следующее:

По умолчанию значения hash () объектов str, bytes и datetime «соленые» с непредсказуемым случайным значением. Хотя они остаются постоянными в рамках отдельного процесса Python, они не предсказуемы между повторными вызовами Python.

Вот почему у вас есть четкое хэш-значение для той же строки в другой консоли.

То, что вы реализуете, не очень хорошо.

Когда вы хотите вычислить значение хеш-строки, просто используйте hashlib

hash () is чтобы получить значение хеш-объекта, а не стимул.

-3
ответ дан Adam Wen 16 August 2018 в 01:07
поделиться
  • 1
    hash() отлично подходит для строковых или числовых значений. Вы смешиваете это с пользовательским методом __hash__, используя на hash() , чтобы обеспечить пользовательскую реализацию хэш-значения. – Martijn Pieters♦ 17 December 2014 в 11:05

Хеш-рандомизация включена по умолчанию в Python 3 . Это функция безопасности:

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

В предыдущих версиях 2.6.8 вы можете включить его в командной строке с параметром -R или PYTHONHASHSEED .

Вы можете выключите его, установив PYTHONHASHSEED в ноль.

4
ответ дан Peter Wood 16 August 2018 в 01:07
поделиться
  • 1
    Это объясняет, как отключить функцию, а не почему она в первую очередь. – Martijn Pieters♦ 17 December 2014 в 11:05
  • 2
    @MartijnPieters Я не нашел времени, чтобы расширить свой ответ, как вы это делали. – Peter Wood 17 December 2014 в 11:15
Другие вопросы по тегам:

Похожие вопросы: