#c #c 11 #stl
#c #c 11 #stl
Вопрос:
У меня есть sub_string
структура, и я хотел бы использовать стандартные инструменты для вычисления ее хэша:
struct sub_string
{
const char* ptr;
size_t size;
};
Вот некоторые ограничения:
- Это должно быть сделано стандартными инструментами, предоставляемыми
c 11
. const char*
не обязательно завершаться нулем.- Я не хочу использовать
std::hash<const char*>
специализацию, поскольку она вычисляет хэш на основе указателя без проверки содержимого. - Я не хочу создавать новый
std::string{ptr, size}
только для вычисления хэша. - Я хотел бы, чтобы
sub_string
значение хэша совпадало сstd::string{ptr, size}
значением хэша. - Я не хочу касаться деталей реализации
std::string
.
Как это сделать?
Ответ №1:
Вы не можете делать то, что хотите, не ослабив одно из ваших ограничений.
std::string
точный алгоритм хэширования определяется реализацией. Таким образом, единственным способом имитировать это было бы положиться на std::string
алгоритм хэширования, либо создав std::string
, либо позаимствовав реализацию вручную для вашего собственного типа. Поскольку вы не будете полагаться на std::string
детали реализации (которые могут позволить вам подделать a std::string
, не создавая его на самом деле, или вручную написать копию используемого алгоритма хеширования), и не хотите создавать a std::string
, вы не сможете достичь желаемого с помощью C 11. Вам понадобится поддержка C 17, чтобы позволить вам создать std::string_view
(которая имеет гарантированное соответствие с std::string
хэшем), и вы уже сказали, что C 11 — это ваш предел, не оставляя других вариантов.