Есть несколько вещей, которые люди пытаются попробовать:
В случае хэша, где вывод состоит всего из 4 десятичных цифр, вы можете атаковать его просто построив таблицу всех возможных 7-значных входов вместе со своим хешированным значением. Затем вы можете перевернуть таблицу, и у вас есть (один-ко-многим) де-хэширование. Вам никогда не нужно знать, как вычисляется хэш. Как вы получаете пары ввода / вывода? Ну, если аутсайдер может каким-то образом указать значение, которое нужно хэшировать, и увидеть результат, тогда у вас будет то, что называется «выбранным открытым текстом», а атака, основанная на этом, - это «выбранная атака открытого текста». Таким образом, 7-значный -> 4-значный хеш был бы очень слабым, если бы он использовался таким образом, который позволял выбранным атакам открытого текста генерировать много пар ввода / вывода. Я понимаю, что это всего лишь один пример, но это также всего лишь один пример метода для его отмены.
Обратите внимание, что обратное проектирование хэша и, фактически, его изменение, - это две разные вещи. Вы можете понять, что я использую SHA-256, но это не помогло бы вам отменить его (т. Е. Получить результат, выработать входное значение). Никто не знает, как полностью отменить SHA-256, хотя, конечно, всегда есть радужные таблицы (см. «Соль», выше). <conspiracy>
По крайней мере, никто не признает, что они делают, так что это бесполезно для вас или меня. </conspiracy>
Stan Lippman говорил об этом здесь . Я думал, что это было интересно.
Сводка : Stroustrup первоначально использовал class
для определения типов в шаблонах, чтобы не представлять новое ключевое слово. Некоторые в комитете волновались что эта перегрузка ключевого слова, ведомого к беспорядку. Позже, комитет представил новое ключевое слово typename
для разрешения синтаксической неоднозначности и решил позволить ей также использоваться, чтобы определить, что шаблонные типы для сокращения беспорядка, но для обратной совместимости, class
сохранили ее перегруженное значение.
По словам Scott Myers, Эффективный C++ (3-й редактор) объект 42 (который должен, конечно, быть окончательным ответом) - различие - "ничто".
Совет состоит в том, чтобы использовать "класс", если ожидается, что T всегда будет классом с "именем типа", если другие типы (интервал, символ* безотносительно) могут ожидаться. Считайте его подсказкой использования.
Я предпочитаю использовать имя типа, потому что я не поклонник перегруженных ключевых слов (здорово - сколько различных значений делает static
, имеют для всевозможных контекстов?).
В ответ на 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.
Это не имеет значения вообще, но класс делает, это быть похожим на T может только быть класс, в то время как это может, конечно, быть любой тип. Таким образом, имя типа более точно. С другой стороны, большинство людей использует класс, так, чтобы было, вероятно, легче читать обычно.
Насколько я знаю, это не имеет значения, какой Вы используете. Они эквивалентны в глазах компилятора. Используйте, какой бы ни один Вы предпочитаете. Я обычно использую класс.
Расширение комментария DarenW.
После того, как typename и class не будут восприниматься как сильно отличающиеся, может быть по-прежнему допустимы строгие требования к их использованию. Используйте class, только если это действительно класс, и typename, если это базовый тип, например char .
Эти типы действительно также принимаются вместо typename
template < char myc = '/'>
, который в этом случае даже превосходит typename или class.
Подумайте о «понятности» или понятности для других людей. И на самом деле учтите, что стороннее программное обеспечение / скрипты могут попытаться использовать код / информацию, чтобы угадать, что происходит с шаблоном (рассмотрим swig).
Просто чистая история. Цитата из Стэна Липпмана :
Причина появления двух ключевых слов историческая. В исходной спецификации шаблона Страуструп повторно использовал существующее ключевое слово class, чтобы указать параметр типа, а не вводить новое ключевое слово, которое, конечно, могло бы нарушить работу существующих программ. Дело не в том, что новое ключевое слово не рассматривалось - просто в том, что оно не считалось необходимым, учитывая его потенциальное нарушение. И до стандарта ISO-C ++ это был единственный способ объявить параметр типа.
Но лучше использовать typename , а не class ! См. Ссылку для получения дополнительной информации, но подумайте о следующем коде:
template <class T>
class Demonstration {
public:
void method() {
T::A *aObj; // oops ...
};