среда, 16 марта 2011 г.

О многозначности уникальности

Это перевод On the ambiguity of uniqueness. Автор: Реймонд Чен.

Документация MSDN описывает System.Object.GetHashCode так:
Реализация GetHashCode, предоставляемая классом String, возвращает уникальные хэш-коды для уникальных строковых значений.
Это ещё один случай многозначного использования слова "уникальный". Предполагаемое значение: "для каждого строкового значения возвращается один и тот же хэш-код".

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

Ещё одно конфликтующее значение "уникальный" - это "вы каждый раз получаете одно и то же значение" против "вы каждый раз получаете разные значения":
  • GetCurrentProcessId возвращает уникальное значение, идентифицирующее процесс. При каждом вызове вы получите одно и то же значение.
  • CoCreateGuid возвращает уникальный GUID. Вы получаете разные значения при каждом вызове.
В оригинальном стандарте C malloc(0) (прим.пер.: грубый аналог GetMem(Result, 0)) разрешалось возвращать nil или "уникальный указатель". Что означает здесь слово "уникальный"? Означает ли это, что все значения, отличные от nil, равны между собой? Могу я сделать Assert(malloc(0) = malloc(0))? Или же это означает, что не nil значение будет отличаться от любого другого возвращаемого значения malloc?

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

Моё предложение: не используйте слово "уникальный". Оно слишком многозначно.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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