Существует ли “достаточно хорошая” хеш-функция для среднего программиста?

Используйте 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?

5
задан Community 23 May 2017 в 10:27
поделиться

7 ответов

В Эффективная Java Джошуа Блоха есть отличный hashCode (). Пример главы 3 «Методы, общие для всех объектов» был бесплатным (ну, это было раньше, когда на старом сайте Sun была страница для него. Если вы выполните поиск, вы все равно можете найти PDF-версию эта глава где-то валяется).

Вы также можете посмотреть исходный код HashCodeBuilder на Apache Commons Lang, но просто не копируйте его для класса, не цитируя его. Пришло время, потраченное на то, чтобы действительно узнать об этом - это сделает вас лучше.

4
ответ дан 13 December 2019 в 22:10
поделиться

Хотя тег отсутствует, я предполагаю, что вы говорите о Java.

Одно «ленивое» решение поставляется с Eclipse 3.5, которое генерирует для вас хеш-коды при нажатии кнопки. toString () и equals () тоже. Очень хорошо! Я подозреваю, что вы можете найти аналогичные функции в IDEA и NetBeans.

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

2
ответ дан 13 December 2019 в 22:10
поделиться

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

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

hashcode=(field1.hashcode()*7)+(field2.hashcode()*3)+(field3.hashcode()*51)...
2
ответ дан 13 December 2019 в 22:10
поделиться

Если вы работаете в Windows, вы можете использовать HashData ( ) .

1
ответ дан 13 December 2019 в 22:10
поделиться

Это функция комбинирования хэш-кодов, которую я использую (в 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;
} 
1
ответ дан 13 December 2019 в 22:10
поделиться

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

Если вы знакомы с дизайном реляционной базы данных, подумайте о своем первичный ключ объекта? Какие значения составляют первичный ключ?

Скажите, что это a, b и c , тогда ваша реализация hashCode будет выглядеть так

return a.hashCode() ^ b.hashCode() ^ c.hashCode();

^ - побитовое XOR (исключающее ИЛИ) операции, таким образом вы можете связать вместе любое количество значений, чтобы сформировать хэш-значение, и при этом поддерживать приличный разброс.

0
ответ дан 13 December 2019 в 22:10
поделиться

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

0
ответ дан 13 December 2019 в 22:10
поделиться
Другие вопросы по тегам:

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