Я могу зависеть от значений GetHashCode (), чтобы быть последовательным?

Вы вызываете запомненный обратный вызов каждый раз, когда вы делаете:

const calcCallback = useCallback(() => expensiveCalc('useCallback'), [neverChange]);
const computedCallback = calcCallback();

Вот почему счет useCallback увеличивается. Однако функция никогда не меняется, она никогда не создает ***** новый обратный вызов, он всегда один и тот же. Значение useCallback правильно выполняет свою работу.

Давайте сделаем некоторые изменения в вашем коде, чтобы убедиться, что это правда. Давайте создадим глобальную переменную lastComputedCallback, которая будет отслеживать, возвращается ли новая (другая) функция. Если возвращается новая функция, это означает, что useCallback просто «выполняется снова». Поэтому, когда он снова запустится, мы назовем expensiveCalc('useCallback'), так как вы рассчитываете, если useCallback сработал. Я делаю это в приведенном ниже коде, и теперь ясно, что useCallback запоминается, как и ожидалось.

Если вы хотите, чтобы useCallback воссоздала функцию каждый раз, тогда раскомментируйте строку в массиве, который проходит second. Вы увидите, как он воссоздает функцию.

'use strict';

const { useState, useCallback, useMemo } = React;

const neverChange = 'I never change';
const oneSecond = 1000;

let lastComputedCallback;
function App() {
  const [second, setSecond] = useState(0);
  
  // This          
15
задан Jason Bunting 9 September 2008 в 22:54
поделиться

8 ответов

Если я не ошибаюсь, GetHashCode последователен, учитывая то же значение, но он, КАК гарантируют, не будет последователен через различные версии платформы.

Из документов MSDN о Строке. GetHashCode ():

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

31
ответ дан 1 December 2019 в 00:33
поделиться

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

5
ответ дан 1 December 2019 в 00:33
поделиться

Интересно, существуют ли различия между 32-разрядными и 64-разрядными операционными системами, потому что я уверен, что и мой сервер и домашний компьютер выполняют ту же версию.NET

, я был всегда утомленным от использования GetHashCode (), это могла бы быть хорошая идея для меня только к роли мой собственный хеш-алгоритм. Хорошо, по крайней мере, я закончил тем, что писал быстрый переиндекс .aspx страница из-за этого.

0
ответ дан 1 December 2019 в 00:33
поделиться

Вы выполняете Win2008 x86 как свой рабочий стол? Поскольку Win2008 включает версию 2.0.50727.1434 , которая является обновленной версией 2,0 включенных в Vista RTM.

0
ответ дан 1 December 2019 в 00:33
поделиться

, Что мы действительно замечали однако, когда объект находится в хешированном объекте коллекции (хеш-таблица, словарь и т.д.), когда 2 объекта не уникальны, но их хэш-коды, хэш-код используется только в качестве первого поиска опции, если существуют групповые используемые хэш-коды, оператор равенства всегда используется в качестве падения назад для определения равенства.

Это - способ, которым поиски хеша работают, правильно? Каждый блок содержит список объектов, имеющих тот же хэш-код.

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

И если Ваша реализация хеширования достигает хорошего распределения, этот поиск не требуется, т.е. один объект на блок.

мое корректное понимание?

0
ответ дан 1 December 2019 в 00:33
поделиться

Не прямой ответ на Ваш вопрос, на который Jonas ответил хорошо, однако это может быть полезным, если Вы волнуетесь по поводу тестирования равенства в хешах

От наших тестов, в зависимости от того, чего Вы требуете с хэш-кодами в C#, хэш-коды не должны быть уникальными для операций Равенства. Как пример, рассмотрите следующее:

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

равняется оператору, было легко обслужить то, когда мы просто проверили Гуид записи (после проверки пустой указатель).

Unfortuantely размер данных HashCode (являющийся интервалом) зависит от операционной системы, и в нашей системе на 32 бита, хэш-код составил бы 32 бита. Математически, когда мы переопределяем функцию GetHashCode, невозможно генерировать уникальный хэш-код от гуида, который больше, чем 32 бита (посмотрите на него от обратного, как Вы перевели бы целое число на 32 бита в гуид?).

Мы тогда сделали некоторые тесты, где мы взяли Гуид в качестве строки и возвратили HashCode Гуида, который почти всегда возвращает уникальный идентификатор в наших тестах, но не всегда.

, Что мы действительно замечали однако, когда объект находится в хешированном объекте коллекции (хеш-таблица, словарь и т.д.), когда 2 объекта не уникальны, но их хэш-коды, хэш-код используется только в качестве первого поиска опции, если существуют групповые используемые хэш-коды, , оператор равенства всегда используется в качестве падения назад для определения равенства .

, Поскольку я сказал, что это может или не может относиться к Вашей ситуации, но если это, это - удобная подсказка.

ОБНОВЛЕНИЕ

Для демонстрации у нас есть Хеш-таблица:

Key:Object (Хэш-код 1), оцените Объектный A1

Key:Object B (Хэш-код 1), значение Объектный B1

Key:Object C (Хэш-код 1), значение Объектный C1

Key:Object D (Хэш-код 2), значение Объектный D1

Key:Object E (Хэш-код 3), значение Объектный E1

, Когда я называю хеш-таблицу для объекта с ключом Объекта A, объектный A1 будет возвращен после 2 шагов, призыв к хэш-коду 1, тогда равенство проверяет ключевой объект, поскольку нет уникального ключа с хэш-кодом 1

, Когда я назову хеш-таблицу для объекта с ключом Объекта D, объектный D1 будет возвращен после 1 шага, поиск хеша

0
ответ дан 1 December 2019 в 00:33
поделиться

У меня была аналогичная проблема, когда я заполнил таблицу базы данных информацией, которая зависела от String.GetHashCode (не лучшая идея), и когда я обновил сервер, на котором работал, до x64, я заметил значения, которые я получал из String.GetHashCode, не соответствовали тому, что уже было в таблице. Мое решение заключалось в использовании моей собственной версии GetHashCode, которая возвращает то же значение, что и String.GetHashCode на платформе x86.

Вот код, не забудьте скомпилировать с «Разрешить небезопасный код»:

    /// <summary>
    /// Similar to String.GetHashCode but returns the same as the x86 version of String.GetHashCode for x64 and x86 frameworks.
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public static unsafe int GetHashCode32(string s)
    {
        fixed (char* str = s.ToCharArray())
        {
            char* chPtr = str;
            int num = 0x15051505;
            int num2 = num;
            int* numPtr = (int*)chPtr;
            for (int i = s.Length; i > 0; i -= 4)
            {
                num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
                if (i <= 2)
                {
                    break;
                }
                num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
                numPtr += 2;
            }
            return (num + (num2 * 0x5d588b65));
        }
    }
11
ответ дан 1 December 2019 в 00:33
поделиться

Должен сказать ... вы не можете полагаться на это. Например, если я запускаю файл1 через хэш-код md5 в С # и копирую и вставляю тот же файл в новый каталог ... хеш-код получается другим, даже если это тот же файл. Очевидно, это та же версия .net, все то же самое. Единственное, что изменилось, - это путь.

-1
ответ дан 1 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

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