Я могу быть уверен, что встроенный хеш для данной строки всегда является тем же?

вы можете использовать класс по умолчанию Bs4 navbar-dark & ​​amp; bg-dark для темного вида или других цветов вы можете перейти по этой ссылке

Я просто изменяю bg-faded на navbar-dark для белого шрифта & amp; bg-dark для темного фона.

9
задан JohnIdol 22 January 2009 в 13:28
поделиться

12 ответов

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

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

Строковый класс переопределяет реализацию GetHashCode по умолчанию в объекте.

Реализация по умолчанию для ссылочного типа в.NET должна выделить последовательный идентификатор (сохраненный внутренне.NET) и присвоить его объекту (устройство хранения данных "кучи" объектов имеет слот для хранения этого хэш-кода, это только присвоилось на первом вызове к GetHashCode для того объекта).

Следовательно создавая экземпляр класса, присваиваясь ему некоторые значения, затем получающие хэш-код, сопровождаемый путем выполнения той же самой последовательности с тем же множеством значений, приведут к различным хэш-кодам. Это может быть причиной, почему некоторые велись полагать, что хэш-коды могут измениться. На самом деле, хотя это - экземпляр класса, который выделяется, хэш-код однажды выделил тот хэш-код, не изменяется для того экземпляра.

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

Я могу быть уверен, что хеш для данной строки ("очень длинная строка") всегда будет тем же?

В Вашем использовании, да.

Я могу быть уверен, что две различных строки не будут иметь того же хеша?

Нет. Две различных строки могут иметь тот же хеш.

Кроме того, если это возможно, как, вероятно, это должно получить тот же хеш для различных строк?

Вероятность является довольно низкой, получающийся хеш довольно случаен от домена 4G.

5
ответ дан 4 December 2019 в 06:41
поделиться

Да, это будет последовательно, так как строки неизменны. Однако я думаю, что Вы неправильно используете словарь. Необходимо позволить словарю взять хеш строки для Вас при помощи строки как ключ. Хеши, как гарантируют, не будут уникальны, таким образом, можно будет перезаписать один ключ с другим.

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

Да это будет, это быть целью хэш-кода! Это, как гарантируют, не будет тем же между различными версиями времени выполнения tho. Больше информации о MSDN

4
ответ дан 4 December 2019 в 06:41
поделиться

Как другие указали, хеш будет оставаться постоянным со временем. Но почему Вы хешируете строку и затем помещаете ее, как включают Словарь? Хеши, как гарантируют, не будут уникальны. Так Вы сравнения могли бы быть неправильными. Позвольте Словарю сделать, это - задание. Я думаю, что самым соответствующим набором к этому случаю является HashSet.

4
ответ дан 4 December 2019 в 06:41
поделиться

Как многие другие сказали, реализация зависит от версии платформы, но она также зависит от архитектуры. Реализация строки. GetHashCode () является dfferent в x86 и x64 версиях платформы, даже если у них есть тот же номер версии.

Например, если Вы пишете клиент/сервер или тип дистанционной работы .NET архитектуры и хотите использовать строку HashCode, чтобы мешать загрузить большой ресурс, можно только сделать это, если и та же версия и разрядность. Иначе необходимо использовать другой хеш - MD5, SHA и т.д. будет работать правильно.

4
ответ дан 4 December 2019 в 06:41
поделиться

Я могу быть уверен, что хеш для данной строки ("очень длинная строка") всегда будет тем же?

Да

Я могу быть уверен, что две различных строки не будут иметь того же хеша?

Нет

1
ответ дан 4 December 2019 в 06:41
поделиться

Строки хешируются на основе их содержания, таким образом, да, тот хеш должен оставаться тем же со временем при использовании GetHashCode по умолчанию.

1
ответ дан 4 December 2019 в 06:41
поделиться

Документация для Объекта. Состояния GetHashCode

Если два объекта выдерживают сравнение как равные, метод GetHashCode для каждого объекта должен возвратить то же значение.

Таким образом, Вам гарантируют это, хэш-код будет тем же для данной строки. Однако Вам не гарантируют это, это будет уникально (могут быть другие строки, которые имеют тот же хэш-код).

3
ответ дан 4 December 2019 в 06:41
поделиться

Это - яркий пример для зла преждевременной оптимизации.

У Вас есть вывод профилировщика или сравнительного теста, который говорит Вам, что Сравнение строк между записями в том же блоке хеша на самом деле вызывает проблему производительности?

Не думал так. Просто используйте саму строку в качестве ключа в Словаре. Это - то, как Вы, как предполагается, используете его.

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

-1
ответ дан 4 December 2019 в 06:41
поделиться

Как был уже упомянут, можно быть уверены, что хеш для строки partiular совпадет с, они хешируются на основе содержания. Однако Вы не можете быть уверены, что конкретная строка будет хеширована то же для более поздних версий платформы.NET, как упоминается здесь

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

1
ответ дан 4 December 2019 в 06:41
поделиться

Вы не должны предполагать о времени выполнения или версиях, просто использовать этот класс CaseInsensitiveStringComparer, который я сделал в свое свободное время (можно передать его конструктору словаря или если Вы используете.NET 3.5, HashSet):

/// <summary>
/// StringComparer that is basically the same as StringComparer.OrdinalIgnoreCase, except that the hash code function is improved and guaranteed not to change.
/// </summary>
public class CaseInsensitiveStringComparer : StringComparer
{
    /// <summary>
    /// Compares two strings, ignoring case
    /// </summary>
    /// <param name="x">First string</param>
    /// <param name="y">Second string</param>
    /// <returns>Compare result</returns>
    public override int Compare(string x, string y)
    {
        return StringComparer.OrdinalIgnoreCase.Compare(x, y);
    }

    /// <summary>
    /// Checks if two strings are equal, ignoring case
    /// </summary>
    /// <param name="x">First string</param>
    /// <param name="y">Second string</param>
    /// <returns>True if strings are equal, false if not</returns>
    public override bool Equals(string x, string y)
    {
        return Compare(x, y) == 0;
    }

    /// <summary>
    /// Gets a hash code for a string, ignoring case
    /// </summary>
    /// <param name="obj">String to get hash code for</param>
    /// <returns>Hash code</returns>
    public override int GetHashCode(string obj)
    {
        if (obj == null)
        {
            return 0;
        }
        int hashCode = 5381;
        char c;
        for (int i = 0; i < obj.Length; i++)
        {
            c = obj[i];
            if (char.IsLower(c))
            {
                c = char.ToUpperInvariant(c);
            }
            hashCode = ((hashCode << 5) + hashCode) + c;
        }
        return hashCode;
    }
}
2
ответ дан 4 December 2019 в 06:41
поделиться

Учитывая, что существует бесконечное число различных строк его просто не возможно выделить другой интервал (32 бита, которые могут представить до 4 миллиардов), число для каждого.

Со всего 8 символами tehre 2^60 различные строки. Это бесконечно больше, чем 2^32. Естественно хэш-код некоторых из этих строк должен столкнуться.

Два объекта с тем же хэш-кодом не должны быть равными. Знать наверняка использование равняется методу. Это - в основном стратегия, используемая hashmap, чтобы определить, равны ли ключи.

Map.get (Строковый ключ)

  • Вычислите хэш-код ключа
  • Используйте по модулю для выяснения, какой ключ блока принадлежит также.
  • Цикл посредством всех записей от того блока, пытающегося найти ключ соответствия.
  • Когда ключевое соответствие найдено, возвращают значение тех записей.

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

javadoc для Object.hashcode делает для интересного чтения - я вставил отрывок ниже.

 The equals method implements an equivalence relation:

* It is reflexive: for any reference value x, x.equals(x) should return true.
* It is symmetric: for any reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
* It is transitive: for any reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
* It is consistent: for any reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the object is modified.
* For any non-null reference value x, x.equals(null) should return false. 

Равняется методу для реализаций объекта класса самое отличительное отношение эквивалентности на объектах; то есть, поскольку любая ссылка оценивает X и Y, этот метод возвращает true, если и только если X и Y относятся к тому же объекту (x == y, имеет верное значение).

1
ответ дан 4 December 2019 в 06:41
поделиться
Другие вопросы по тегам:

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