Как вычислить хэш const char * с заданным размером и проверкой содержимого с помощью стандартных инструментов

#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 — это ваш предел, не оставляя других вариантов.