Как вычислить хэш строки

Jumbo.love
Дата: 25.04.2011 00:13:26
Мне нужно для задачи со строками уметь считать хэш для строк хотя бы длины 100 символов. Нашёл как это делать (http://e-maxx.ru/algo/string_hashes), но в delphi даже при подсчёте степеней P возникает переполнение на степени 12. Как можно выгодно в delphi посчитать хэш строки или хотя как сделать, что бы число обрезалось и не было ошибки с переполнением?
Dimitry Sibiryakov
Дата: 25.04.2011 00:24:54

Jumbo.love
Как можно выгодно в delphi посчитать хэш строки

В Indy дофига классов для вычисления хэшей, включая CRC32 и SHA1.

Posted via ActualForum NNTP Server 1.4

Zelius
Дата: 25.04.2011 13:11:36
В Indy10 искать TIdHashMessageDigest5
S.G.
Дата: 25.04.2011 15:17:08
Jumbo.love
Мне нужно для задачи со строками уметь считать хэш для строк хотя бы длины 100 символов. Нашёл как это делать (http://e-maxx.ru/algo/string_hashes), но в delphi даже при подсчёте степеней P возникает переполнение на степени 12. Как можно выгодно в delphi посчитать хэш строки или хотя как сделать, что бы число обрезалось и не было ошибки с переполнением?


из ссылки, в самом начале:

автор
Само значение хэша желательно хранить в самом большом числовом типе - int64, он же long long. Очевидно, что при длине строки порядка 20 символов уже будет происходить переполнение значение. Ключевой момент - что мы не обращаем внимание на эти переполнения, как бы беря хэш по модулю 2^64.


По умолчанию (если не ошибаюсь) при умножении целых чисел, нет owerflow checking , т.е. не должно возникать ошибки переполнения (хотя переполнение возникает, естественно).
Во всяком случае, можно посмотреть хелп по опции Overflow checking - {$Q+} or {$Q-}
Jumbo.love
Дата: 25.04.2011 15:56:20
S.G.,

при попытке присвоить переменной значение не из диапазона прога сразу вылетает.
S.G.
Дата: 25.04.2011 18:00:42
Jumbo.love
S.G.,

при попытке присвоить переменной значение не из диапазона прога сразу вылетает.
Да.
Но никто не предлагает присваивать не из диапазона.
Jumbo.love
Дата: 25.04.2011 18:45:24
S.G.,

так в том и вопрос: в процессе вычисления степеней P в цикле 31 (например) возводится в степень как exp (ln(31)*i) и на i=12 вылетает и надо проследить, чтобы число обрезалось
Нелояльный
Дата: 25.04.2011 19:58:13
А где там вычисление степеней через логарифмы и экспоненты? Каждый раз происходит умножение целочисленного значения на 31, например. Результат в этом случае обрезается каждый раз безо всяких ошибок.
Jumbo.love
Дата: 25.04.2011 20:07:31
Нелояльный,

можно и так, сейчас попробую
Jumbo.love
Дата: 25.04.2011 20:15:28
Вот блин, получилось, правда он округляет почему-то до отрицательных, но ладно