Используйте optparse
, который идет со стандартной библиотекой. Например:
#!/usr/bin/env python
import optparse
def main():
p = optparse.OptionParser()
p.add_option('--person', '-p', default="world")
options, arguments = p.parse_args()
print 'Hello %s' % options.person
if __name__ == '__main__':
main()
Источник: Используя Python для создания инструментов командной строки UNIX
Однако с Python 2.7 optparse удерживается от использования, см.: , Почему использование argparse, а не optparse?
В Эффективная Java Джошуа Блоха есть отличный hashCode (). Пример главы 3 «Методы, общие для всех объектов» был бесплатным (ну, это было раньше, когда на старом сайте Sun была страница для него. Если вы выполните поиск, вы все равно можете найти PDF-версию эта глава где-то валяется).
Вы также можете посмотреть исходный код HashCodeBuilder на Apache Commons Lang, но просто не копируйте его для класса, не цитируя его. Пришло время, потраченное на то, чтобы действительно узнать об этом - это сделает вас лучше.
Хотя тег отсутствует, я предполагаю, что вы говорите о Java.
Одно «ленивое» решение поставляется с Eclipse 3.5, которое генерирует для вас хеш-коды при нажатии кнопки. toString () и equals () тоже. Очень хорошо! Я подозреваю, что вы можете найти аналогичные функции в IDEA и NetBeans.
Кроме этого, подойдет практически любая хеш-функция, которая последовательно генерирует одно и то же значение для одного и того же ввода. Это (вероятно) повлияет только на эффективность таких вещей, как HashMaps.
Если вы говорите относительно определения хэш-кодов для пользовательских классов, лучше всего будет определить некую математическую конкатенацию всех ваших функций хэш-кода полей.
При определении хэш-кода ваша цель, как правило, состоит в том, чтобы свести к минимуму коллизии, поэтому, если вы сделаете что-то вроде этого, вы, как правило, ничего не увидите.
hashcode=(field1.hashcode()*7)+(field2.hashcode()*3)+(field3.hashcode()*51)...
Если вы работаете в Windows, вы можете использовать HashData ( ) .
Это функция комбинирования хэш-кодов, которую я использую (в C #):
public static int CombineHashCodes(params int[] hashCodes)
{
unchecked
{
var result = 0;
foreach (var hash in hashCodes)
result = (result * 397) ^ hash;
return result;
}
}
Интуитивно понятно, что аспект комбинирования - это оператор XOR. Вот как .NET 4 делает это для кортежей:
public static int CombineHashCodes(int h1, int h2)
{
return ((h1 << 5) + h1) ^ h2;
}
В любой управляемой среде необработанной реализацией хэш-функции объектов является сам адрес памяти. Если вас не интересуют свойства хэш-функции, подойдет любое значение, если существует какое-то отношение эквивалентности между отдельными экземплярами, представляющими одно и то же значение.
Если вы знакомы с дизайном реляционной базы данных, подумайте о своем первичный ключ объекта? Какие значения составляют первичный ключ?
Скажите, что это a, b и c
, тогда ваша реализация hashCode будет выглядеть так
return a.hashCode() ^ b.hashCode() ^ c.hashCode();
^ - побитовое XOR (исключающее ИЛИ) операции, таким образом вы можете связать вместе любое количество значений, чтобы сформировать хэш-значение, и при этом поддерживать приличный разброс.
Чтобы ответить на ваш вопрос о том, что может пойти не так: хэш-код, сгенерированный вашей функцией, будет использоваться для поиска места для экземпляров вашего класса, если вы поместите его в хеш-таблицу (словарь / карту) . Если ваша хеш-функция генерирует слишком много конфликтов, производительность ваших хэш-таблиц может быть такой же плохой, как O (n).