Возникли вопросы:
1) Что такое А,B,+ ?
2) + слева от равеснства и справа от равенства это обязательно одна и таже операция ?
3) И нафиг тебе такое вообще нужно ? :)
А так, палцем в небо, вот тебе решение с обычной быстрой хеш-функцией.
Использовал в трансляторе одного языка программирования.
unsigned int hash(unigned int dwHash, const char * text)
{
if (text == 0 )
return 0;
while (*text)
dwHash = (dwHash << 5) + dwHash + *text++;
return dwHash;
}
Для нее выполняется равенство
hash(hash(0,A),B) = hash(0,concat(A,B))
A,B - строки, concat - конкатенация строк
> 1) Что такое А,B,+ ?
это строки
> 2) + слева от равеснства и справа от равенства это обязательно одна и таже операция ?
hash(A) + hash(B) - это сложение интов, т.к. hash(?) - это инт
A+B - это конкатенация строк
> 3) И нафиг тебе такое вообще нужно ? :)
это мне надо для анимации. Тоесть у нас например есть несколько анимированых человечков мы берем подставляем "название человечка" + "бежать", а т.к. работа со строками это зло ( в плане скорости ), то мне надо сделать это интами. Конечно могут быть и повторения но это все будет на при экспорте проверяться.
> А так, палцем в небо, вот тебе решение с обычной быстрой хеш-функцией. Использовал в трансляторе одного языка программирования.
Ну это точно пальцем в небо, слишком много повторений будет, а это плохо.
> 2) + слева от равеснства и справа от равенства это обязательно одна и таже операция ?
hash(A) + hash(B) - это сложение интов, т.к. hash(?) - это инт A+B - это конкатенация строк
> 3) И нафиг тебе такое вообще нужно ? :)
это мне надо для анимации. Тоесть у нас например есть несколько анимированых человечков мы берем подставляем "название человечка" + "бежать", а т.к. работа со строками это зло ( в плане скорости ), то мне надо сделать это интами. Конечно могут быть и повторения но это все будет на при экспорте проверяться.
> А так, палцем в небо, вот тебе решение с обычной быстрой хеш-функцией. Использовал в трансляторе одного языка программирования.
Ну это точно пальцем в небо, слишком много повторений будет, а это плохо.
Хе-хе :) Ниче не понял :)
Каких повторений ? Всмысле коллизий что-ли ? Да не очень много.
Точно не понмню, но в моей хеш-таблице на тестовых данных в 50 000
разных строк максимальная цепочка коллизий была что-то около 3-4 элементов. Для современной машины это копейки.
А так:
hash(hash(0,"человечек"),"бежать") = hash(0,сoncat("человечек","бежать"))
но
hash(hash(0,"бежать"),"человечек") <> hash(0,concat("человечек","бежать"))
в том виде в каком ты сформулировал, подходит ф-ция единственного вида: hash("abc") = f("a") + f("b") + f("c"), где функция f фиксированная произвольная.
На самом деле операция hash(hash(0,A),B) просто расчитывает хеш для А, а потом "досчитывает" туда B. Так можно многие хеш-функции использовать. Возьми например функцию из Дракона.
Вам бы курс алгебры для ВУЗов послушать :-) Операция сложения в этом случае по условиям задачи должна быть определена как операция абстрактного сложения в коммутативной группе значений хэша, а вы это правило нарушили :-)