1) Можно ли использовать signed типы данных для хеширования? Не создает ли это ситауаций, когда хеши не совпадают (особенно если пользоваться всеми прелестями хешей, вроде поиска хеша подстроки за O(1))?
2) Почему в G++ операции с unsinged long long заметно тормознутее, чем с signed long long?
Вообще переполнение signed — undefined behavior. Но у меня проблем никогда не было, если забывал дописывать unsigned.
А переполнение unsigned прописано в документации? Я почему спрашиваю -- вот у e-maxx хеши по signed считаются: http://e-maxx.ru/algo/string_hashes
при переполнение unsigned гарантируется ожидаемое поведение.
Хэши по модулю 2k писать вообще не стоит.
Обычно использовать нельзя, потому что переполнение целых типов со знаком — неопределённое поведение.
Производительность может различаться, потому что для беззнаковых типов включаются одни оптимизации и выключаются другие, а для знаковых типов — наоборот. Например,
можно соптимизировать в
i < 1
, еслиi
—signed
, и нельзя, еслиi
—unsigned
(это следует из первого абзаца). Однако редко когда скорость работы будет сильно отличаться. Надо использовать то, что лучше подходит по логике.