erthink/t1ha

Работа со строками

F474M0R64N4 opened this issue · 5 comments

Как работать со строками?

Можете привести пример для хеширования строки?

Для хеширования блока данных нужно передать его адрес (указатель на начало) и размер (количество байт).
Например, hash = t1ha0(str, strlen(str), seed); для традиционных C-строк.

@leo-yuriev правильно?

	UINT64 Hash = 0;
	auto str = "hash";
	Hash = t1ha0(str, strlen(str), 0x1EE7C0DE);

Да, так можно.

Но лучше:

inline uint64_t t1ha0(const char*cstr, const uint64_t seed) {
  return t1ha0(cstr, strlen(cstr), seed);
}
inline uint64_t t1ha0(const std::string &str, const uint64_t seed) {
  return t1ha0(str.data(), str.size(), seed);
}
inline uint64_t t1ha0(const std::string_view &str, const uint64_t seed) {
  return t1ha0(str.data(), str.size(), seed);
}

Или

struct cxx_string_functor_for_t1ha0 {
  const uint64_t seed;
  cxx_string_functor_for_t1ha0(const uint64_t seed) : seed(seed) {}
  uint64_t operator()(const char*cstr) const {
    return t1ha0(cstr, strlen(cstr), seed);
  }
  uint64_t operator()(const std::string &str) const {
    return t1ha0(str.data(), str.size(), seed);
  }
  uint64_t operator()(const std::string_view &str) const {
    return t1ha0(str.data(), str.size(), seed);
  }
};

@leo-yuriev спасибо.
есть ошибка
C2270 't1ha0': modifiers not allowed on nonmember functions

код

void CheckRegistration(std::string RegNumber, bool* b)
{
	if (t1ha0(RegNumber, RegNumber, 10376313370251892926) == 7530078511373767546)
	{
		*b = true;
	}
	else {
		*b = false;
	}
}

и еще вылазит такое счастье
't1ha0': none of the 3 overloads could convert all the argument types

В первой группе функций был лишний const из-за copy-paste.

Про остальное - вам просто нужно освоить C++ и быть внимательным.