Реализация - хеширует/-isEqual:/-isEqualTo …: для наборов Objective C

Используйте функцию генератора для генерации итератора.

def foo_gen():
    n = 0
    while True:
        n+=1
        yield n

Тогда использование это как

foo = foo_gen().next
for i in range(0,10):
    print foo()

, Если Вы хотите верхний предел:

def foo_gen(limit=100000):
    n = 0
    while n < limit:
       n+=1
       yield n

, Если итератор завершается (как пример выше), можно также циклично выполниться по нему непосредственно, как

for i in foo_gen(20):
    print i

, Конечно, в этих простых случаях, лучше использовать xrange:)

Вот документация относительно оператор .

урожая

46
задан 13 revs, 2 users 66% 23 May 2017 в 12:34
поделиться

2 ответа

Я думаю, что попытки придумать какую-нибудь полезную хеш-функцию, которая будет генерировать уникальные хеш-значения для коллекций, - бесполезное занятие. Предложение U62 об объединении хешей всего содержимого не будет хорошо масштабироваться, так как оно делает хеш-функцию O (n). Для обеспечения хорошей производительности хеш-функции действительно должны быть O (1), иначе цель хеширования будет нарушена. (Рассмотрим обычную конструкцию какао-списков, которые представляют собой словари, содержащие массивы и другие словари, потенциально до тошноты. Попытка получить хэш словаря верхнего уровня большого списка была бы мучительно медленной, если бы хэш-функции коллекций были бы O ( n).)

Я бы посоветовал не особо беспокоиться о хеш-коде коллекции. Как вы сказали, -isEqual: подразумевает одинаковые значения -hash . С другой стороны, равные значения -hash не подразумевают -isEqual: . Этот факт дает вам большую свободу действий при создании простого хэша.

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

Я надеюсь, что это ответит хотя бы на один из ваших вопросов.

Что касается № 1: реализация -isEqual: довольно проста. Вы перечисляете содержимое и проверяете isEqual: для каждого из элементов.

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

Нет. 2 довольно расплывчатый. Не уверен, что вы имеете в виду.

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

Нет. 2 довольно расплывчатый. Не уверен, что вы имеете в виду.

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

Нет. 2 довольно расплывчатый. Не уверен, что вы имеете в виду.

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

Нет. 2 довольно расплывчатый. Не уверен, что вы имеете в виду.

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

Нет. 2 довольно расплывчатый. Не уверен, что вы имеете в виду.

isEqual: и -hash не согласуются. Конечно, это вина клиента, но это еще один аргумент против того, чтобы ваш -hash основывался на содержании коллекции.

Нет. 2 довольно расплывчатый. Не уверен, что вы имеете в виду.

isEqual: и -hash не согласуются. Конечно, это вина клиента, но это еще один аргумент против того, чтобы ваш -hash основывался на содержании коллекции.

Нет. 2 довольно расплывчатый. Не уверен, что вы имеете в виду.

18
ответ дан 26 November 2019 в 20:43
поделиться

Two collections should be considered equal if they contain the same elements, and further if the collections are ordered, that the elements are in the same order.

On the subject of hashes for collections, it should be enough to combine the hashes of the elements in some way (XOR them or modulo add them). Note that while the rules state that two objects that are equal according to IsEqual need to return the same hash, the opposite does not hold : Although uniqueness of hashes is desireable, it is not necessary for correctness of the solution. Thus an ordered collection need not take account of the order of the elements.

The excerpt from the Apple documentation is a necessary restriction by the way. An object could not maintain the same hash value under mutation while also ensuring that objects with the same value have the same hash. That applies for the simplest of objects as well as collections. Of course it only usually matters that an object's hash changes when it is inside a container that uses the hash to organise it's elements. The upshot of all this is that mutable collections shouldn't mutate when placed inside another container, but then neither should any object that has a true hash function.

4
ответ дан 26 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

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