он работает нормально, но я выигрыш понимаю ("соль" + ул (п) + ул (х) + «соль)
Эта часть тривиальна. .
Во-первых, str
функции принимает любой объект и преобразует его в строковое представление. Например, ni
будет несколько 0
или 1
, который str
преобразует в строку "0"
или "1"
.
Далее мы просто объединяем четыре строки вместе: "a" + "bc" + "d" + "ef"
дает вам "abcdef"
.
Я предполагаю, что вы на самом деле запрашиваемая почему вы могли бы сделать это.
Когда вы пишете хеш-функцию для некоторой комбинации значений в терминах более простой хэш-функции, вы должны быть осторожны, чтобы убедиться, что вы включили какое-то «соление», поэтому ваша особая комбинация значений не имеет значения, t случайный хэш в том же виде, что и простая комбинация одних и тех же значений.
Для еще более простого примера рассмотрим этот класс:
class Point(object):
def __init__(self, x, y):
self.x, self.y = x, y
def __hash__(self):
return hash((self.x, self.y))
Но это означает, что hash((1.0, 2.0)) == hash(Point(1.0, 2.0))
. Обычно вы этого не хотите; Точка - это не то же самое, что кортеж, это тип со своей (очень тонкой, но не несуществующей) семантикой. Таким образом, вы вставляете какую-то дополнительную ценность, называемую «солью», в хэш. Например:
class Point(object):
def __init__(self, x, y):
self.x, self.y = x, y
def __hash__(self):
return hash((type(self), self.x, self.y))
И теперь, hash((1.0, 2.0)) != hash(Point(1.0, 2.0))
.
Обратите внимание, что это отличается от других важных причин засоления хэшей, но не имеет никакого отношения к ним (например, в криптографических хешах вы можете обсудить некоторые общие случайные несе, чтобы использовать их в качестве соли, чтобы убедиться, что никто не может воспроизвести те же результаты хеширования, если у них нет согласованной соли, и вы можете использовать протоколы обмена ключами, чтобы убедиться, что они не имеют этого).
Однако стоит упомянуть, что это очень глупа хеш-функция.
Во-первых, он более прост, более прочен и более эффективен для хэширования кортежей значений, чем для конкатенированной строки. Скорее всего, этот код был написан для другого языка, который не имел общей функции hash
, только функция hash_string
.
Во-вторых, единственная причина, по которой вы хотели бы добавить и добавить соль, а не только одну или другую, - это если вы не доверяете функции hash
, на которую вы полагаетесь, чтобы обрабатывать части ее равномерно. И действительно, если вы не можете доверять этому, наложение соли на обоих концах не очень помогает - и может нанести боль. (Например, если ваш hash_string
недооценивает все после первых нескольких символов, то добавление соли прекрасно предотвращает столкновение с несоленными значениями, а его добавление не будет - но это также означает, что вы нажимаете еще 4 фактических персонажа из избыточного количества символов, что ваши соленые хэши будут еще хуже распределены, чем обычные хэши. Если вы действительно не можете доверять хеш-функции, вы не можете построить более сложную хеш-функцию поверх нее, у вас есть чтобы создать свой собственный.
Действительно ли это конкатенация строк (или 'str' вызовов), которые вы не понимаете? Или вы не понимаете _why_ они это делают или как« лямбда »используется для обертывания это как функция или что-то еще, кроме того, что вы задали? – abarnert
Не понимаю, почему автор конкатенирует «соль». – Siddarth