Использовать 'class' или 'typename' для параметров шаблона? [Дубликат]

Есть несколько вещей, которые люди пытаются попробовать:

  • Получить исходный код или дизассемблировать исполняемый файл.
  • Угадайте, основываясь на хэш-функциях, которые используют другие люди. Например, хэш, состоящий из 32 шестнадцатеричных цифр, может быть одним или несколькими повторениями MD5, и если вы можете получить одну пару входных / выходных данных, то это довольно легко подтвердить или опровергнуть (хотя см. «Соль» ниже) .
  • Статистически проанализировать большое количество пар входов и выходов, искать любые шаблоны или корреляции и связывать эти корреляции с свойствами известных хеш-функций и / или возможными операциями, которые разработчик системы возможно, использовали. Это выходит за рамки единой техники и в области общего криптоанализа.
  • Спросите автора. Защищенные системы обычно не полагаются на секретность алгоритмов хеширования, которые они используют (и обычно не остаются в безопасности, если они это делают). Однако примеры, которые вы даете, довольно малы, и безопасное хеширование паролей всегда будет включать соль, которой, по-видимому, нет. Поэтому мы могли бы не говорить о той системе, в которой автор уверен в этом.

В случае хэша, где вывод состоит всего из 4 десятичных цифр, вы можете атаковать его просто построив таблицу всех возможных 7-значных входов вместе со своим хешированным значением. Затем вы можете перевернуть таблицу, и у вас есть (один-ко-многим) де-хэширование. Вам никогда не нужно знать, как вычисляется хэш. Как вы получаете пары ввода / вывода? Ну, если аутсайдер может каким-то образом указать значение, которое нужно хэшировать, и увидеть результат, тогда у вас будет то, что называется «выбранным открытым текстом», а атака, основанная на этом, - это «выбранная атака открытого текста». Таким образом, 7-значный -> 4-значный хеш был бы очень слабым, если бы он использовался таким образом, который позволял выбранным атакам открытого текста генерировать много пар ввода / вывода. Я понимаю, что это всего лишь один пример, но это также всего лишь один пример метода для его отмены.

Обратите внимание, что обратное проектирование хэша и, фактически, его изменение, - это две разные вещи. Вы можете понять, что я использую SHA-256, но это не помогло бы вам отменить его (т. Е. Получить результат, выработать входное значение). Никто не знает, как полностью отменить SHA-256, хотя, конечно, всегда есть радужные таблицы (см. «Соль», выше). <conspiracy> По крайней мере, никто не признает, что они делают, так что это бесполезно для вас или меня. </conspiracy>

566
задан 17 revs, 7 users 85% 5 July 2019 в 15:37
поделиться

8 ответов

Stan Lippman говорил об этом здесь . Я думал, что это было интересно.

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

387
ответ дан Farokh KH 5 July 2019 в 15:37
поделиться

По словам Scott Myers, Эффективный C++ (3-й редактор) объект 42 (который должен, конечно, быть окончательным ответом) - различие - "ничто".

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

300
ответ дан DarenW 5 July 2019 в 15:37
поделиться

Я предпочитаю использовать имя типа, потому что я не поклонник перегруженных ключевых слов (здорово - сколько различных значений делает static, имеют для всевозможных контекстов?).

47
ответ дан Michael Burr 5 July 2019 в 15:37
поделиться

В ответ на Mike B, я предпочитаю использовать 'класс' как в шаблоне, 'имя типа' имеет перегруженное значение, но 'класс' не делает. Возьмите этот проверенный пример целого типа:

template <class IntegerType>
class smart_integer {
public: 
    typedef integer_traits<Integer> traits;
    IntegerType operator+=(IntegerType value){
        typedef typename traits::larger_integer_t larger_t;
        larger_t interm = larger_t(myValue) + larger_t(value); 
        if(interm > traits::max() || interm < traits::min())
            throw overflow();
        myValue = IntegerType(interm);
    }
}

larger_integer_t зависимое имя, таким образом, оно требует, чтобы 'имя типа' предшествовало ему так, чтобы синтаксический анализатор мог распознать, что larger_integer_t тип. класс , на otherhand, не имеет такого перегруженного значения.

, Что... или я просто ленив в глубине души. Я ввожу 'класс' намного чаще, чем 'имя типа', и таким образом нахожу намного легче ввести. Или это мог быть знак, что я пишу слишком много кода OO.

9
ответ дан Community 5 July 2019 в 15:37
поделиться

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

7
ответ дан Frederik Slijkerman 5 July 2019 в 15:37
поделиться

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

1
ответ дан Grant Limberg 5 July 2019 в 15:37
поделиться

Расширение комментария DarenW.

После того, как typename и class не будут восприниматься как сильно отличающиеся, может быть по-прежнему допустимы строгие требования к их использованию. Используйте class, только если это действительно класс, и typename, если это базовый тип, например char .

Эти типы действительно также принимаются вместо typename

template < char myc = '/'>

, который в этом случае даже превосходит typename или class.

Подумайте о «понятности» или понятности для других людей. И на самом деле учтите, что стороннее программное обеспечение / скрипты могут попытаться использовать код / ​​информацию, чтобы угадать, что происходит с шаблоном (рассмотрим swig).

-3
ответ дан 22 November 2019 в 22:11
поделиться

Просто чистая история. Цитата из Стэна Липпмана :

Причина появления двух ключевых слов историческая. В исходной спецификации шаблона Страуструп повторно использовал существующее ключевое слово class, чтобы указать параметр типа, а не вводить новое ключевое слово, которое, конечно, могло бы нарушить работу существующих программ. Дело не в том, что новое ключевое слово не рассматривалось - просто в том, что оно не считалось необходимым, учитывая его потенциальное нарушение. И до стандарта ISO-C ++ это был единственный способ объявить параметр типа.

Но лучше использовать typename , а не class ! См. Ссылку для получения дополнительной информации, но подумайте о следующем коде:

template <class T>
class Demonstration { 
public:
void method() {
   T::A *aObj; // oops ...
};
9
ответ дан 22 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

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