Создайте хеш из строки и интервала

Я использовал Подвижный и на работе и в моих собственных персональных проектах, и я действительно доволен ею. Преимущества, которые я вижу:

  1. управление Локальной версией. Иногда я работаю над чем-то, и я хочу сохранить историю версий на нем, но я не готов продвинуть его к центральным репозиториям. С распределенным VCS я могу просто согласиться на свой локальный repo, пока это не готово без ветвления. Тот путь, если другие люди вносят изменения, в которых я нуждаюсь, я могу все еще получить их и интегрировать их в мой код. Когда я готов, я выставляю его к серверам.
  2. Меньше конфликтов слияния. Они все еще происходят, но они, кажется, являются менее частыми, и являются меньшим количеством риска, потому что во всем коде регистрируются к моему локальному repo, поэтому даже если я порчу слияние, я могу всегда создавать резервную копию и делать это снова.
  3. Отдельный repos как ответвления. , Если у меня есть пара векторов разработки, работающих одновременно, я могу просто сделать несколько клонов своего repo и разработать каждую функцию независимо. Тот путь, если что-то фрагментируется или уменьшилось, я не должен вытаскивать части. Когда они готовы пойти, я просто объединяю их вместе.
  4. Скорость. Подвижный намного быстрее для работы с, главным образом потому что большинство общих операций локально.

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

11
задан OscarRyz 30 July 2009 в 22:24
поделиться

5 ответов

Используйте Apache Commons HashcodeBuilder:

public int hashCode() {
    new HashCodeBuilder(17, 37).
           append(myString).
           append(myInt);
}

Ссылка здесь: http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/HashCodeBuilder.html

А здесь:

http://www.koders.com /java/fidCE4E86F23847AE93909CE105394B668DDB0F491A.aspx

8
ответ дан 3 December 2019 в 07:39
поделиться

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

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

int hashcode() {
    int hash = 1;
    for (int val : this.values) {
        hash = hash * value;
    }
    return hash;
}

Рассмотрим, что произойдет, если элемент this.

1
ответ дан 3 December 2019 в 07:39
поделиться

Или, если вы не хотите добавлять другую библиотеку, сделайте что-нибудь вроде следующего:

public int hashCode() {
    StringBuilder builder = new StringBuilder();
    builder.append(myString);
    builder.append(myInteger);
    return builder.toString().hashCode();
}
2
ответ дан 3 December 2019 в 07:39
поделиться

Eclipse всегда выполняет примерно одну и ту же функцию хеширования, вот пример для класса с полями in и String

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + this.interger;
        result = prime * result + ((this.string == null) ? 0 : this.string.hashCode());
        return result;
    }

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

     public int hashCode(Object ... things) {
         final int prime = 31;
         int result = 1;
         for(Object thing : things) {
             result = prime * result + thing.hashCode();
         }
         return result;
     }
3
ответ дан 3 December 2019 в 07:39
поделиться

В дополнение к последним изменениям, если скорость извлечения важнее, чем проблемы с хранением, вы можете предварительно -вычислить и сохранить хэш-код при создании вашего класса StringInt . Это безопасно, поскольку вы пометили поля String и int как final , а также учитывая, что String является неизменным.

]Также, вы можете оптимизировать свой метод равно , проверив, что сравниваемый объект == this , прежде чем выполнять полное сравнение. Я бы также порекомендовал выполнить более дешевое сравнение на основе int перед сравнением строковых полей.

Еще одно последнее предложение: вы можете изменить свой метод valueOf (String, int) , чтобы создать StringInt или вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt , используя "==", зная, что никакие два StringInt s никогда не будут созданы с одинаковыми Строка и int значение.

Я бы также рекомендовал сделать более дешевое сравнение на основе int перед сравнением строковых полей.

Еще одно последнее предложение: вы можете изменить свой метод valueOf (String, int) , чтобы создать StringInt или вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt , используя "==", зная, что никакие два StringInt s никогда не будут созданы с одинаковыми Строка и int значение.

Я бы также рекомендовал сделать более дешевое сравнение на основе int перед сравнением строковых полей.

Еще одно последнее предложение: вы можете изменить свой метод valueOf (String, int) , чтобы создать StringInt или вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt , используя «==», зная, что никакие два StringInt не будут созданы с одинаковыми Строка и int значение.

int)
, чтобы либо создать StringInt , либо вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt , используя «==», зная, что никакие два StringInt не будут созданы с одинаковыми Строка и int значение.

int) , чтобы либо создать StringInt , либо вернуть ранее созданный экземпляр, если он уже существует с такими же значениями String и int. Это делает строительство более дорогостоящим, но сравнение очень дешевым, поскольку вы можете сравнивать StringInt , используя «==», зная, что никакие два StringInt не будут созданы с одинаковыми Строка и int значение.

0
ответ дан 3 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

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