Я работаю над хэш-функцией, которая получает строку в качестве ввода.Эффективный способ избежать целочисленного переполнения при умножении?
Прямо сейчас я делаю цикл и внутри хэша (переменная int) умножается на значение, а затем код ASCII для текущего символа добавляется в микс.
hash = hash * seed + string[i]
Но иногда, если строка достаточно большой есть целое Переполнение там, что я могу сделать, чтобы избежать этого при сохранении той же хэш-структуру? Может быть, операция немного включена в цикл?
Зачем вам нужно, чтобы избежать переполнение? Единственной важной особенностью хэш-функции является то, что для любых данных хеш-функция дает согласованный результат. Конечно, предотвращение столкновений приятно, но не критично. – torak
Если hash * seed вызывает целочисленное переполнение, а строка [i] положительна, нет никакого способа, чтобы это не вызвало переполнение, независимо от того, каким образом вы пытаетесь это сделать. Вы хотите ограничить хэш до максимального значения с помощью оператора modulo? – bobDevil
@torak: Подписанное целочисленное переполнение вызывает неопределенное поведение в C, а это означает, что правильные программы должны позаботиться о том, чтобы избежать этого. – caf