@JustSokol
newby programmer

Как правильно составить функцию qHash для объекта содержащего два QString? Или просто какой алгоритм для хеширования двух строк?

Необходимо запихивать в QSet пользовательский тип данных, который состоит из двух QString, что-то вроде:

class Mynametype {
public:
    QString firstName;
    QString lastName;
};


Для этого необходимо написать функцию qHash. Интересует именно алгоритм получения неповторяющегося хеша двух строк. Код на С++/Qt не требуется, сам напишу если буду знать как вычислить.

Особенности строк (если это важно):
Первая строка и вторая строка - какие угодно, но не большие (скажем до 100 символов, хотя в среднем по 10, 20 максимум).

Нужно также чтобы было не простая конкатенация и ее хеш, тк нужно чтобы разные пары firstName lastName хешились по разному, даже если конкатенация строк одинаковая. Тоесть если есть скажем полное имя "Abdul Karim Jabar", то
объекты типа Mynametype с { firstName="Abdul ", lastName="Karim Jabar" } и { firstName="Abdul Karim", lastName=" Jabar" }
это РАЗНЫЕ объекты, несмотря на то что конкатенация firstName + lastName равна.

Пока что пришло в голову лишь сделать конкатенацию и в середину всунуть какой-то символ разделитель и уже такую строку захешировать уже имеющимся в Qt методом. Типа:
return qHash(firstName+"|"+lastName);

Но чет не уверен что это нормальный способ, поэтому оцените нормально будет работать или мб в каких-то случаях нет.
Да и хотелось бы что-то более элегантное, особенно с алгоритмической точки зрения.

Вообще говоря исходный тип данных не связан с именами и это просто две разные строки.
Если что, то пробелы и прочие знаки не алфавита не должны никуда деваться и сравниваются на общих основаниях, т.е. например строка с ними на конце или в середине и без них - РАЗНЫЕ строки.
  • Вопрос задан
  • 629 просмотров
Пригласить эксперта
Ответы на вопрос 3
Nipheris
@Nipheris Куратор тега C++
А почему такая странная потребность в УНИКАЛЬНОМ хэше (который вы кстати в принципе не получите для двух строк по 20 символов, т.к. хэш-значение - типа uint)?
> это РАЗНЫЕ объекты, несмотря на то что конкатенация firstName + lastName равна.
ну и пусть, совпадет один раз, не такой уж частый кейс для имени и фамилии. У вас таких Каримов с одинаковым конкатенированным именем тысяча штук будет?
Ответ написан
PavelK
@PavelK
У себя сделал так же как и у вас.
склеивание, а между ними разделитель. работает достаточно быстро.
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Возьмите хэш от каждой строки и сделайте xor. Ну если строки одинаковые, то xor не делайте.
А еще можно посмотреть в сторону boost hash, например.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы