программистское, вкратце
Jun. 8th, 2004 10:58 pmСмешной баг. Примитивная хэш-функция берёт строку и в цикле умножает текущее значение хэша на 33 и прибавляет числовое значение следующего символа в строке. В конце берёт остаток от деления на кол-во слотов в таблице. Всё хорошо, но когда строка оказалась достаточно длинной, значение хэша вышло за пределы 2^32 и не вернулось к нулю, а было переведено слишком умным Perl'ом в тип с плавающей точкой. Который при попытке поделить его с остатком исправно давал 0.
no subject
no subject
Date: 2004-06-08 01:27 pm (UTC)Мне ж надо побыстрячку перл выучить. И сунуться куда его просят.
А я C(теоретически) и PHP
no subject
Date: 2004-06-09 12:52 am (UTC)Ответ был: "Заходишь на гугль, даешь запрос \"Перл за один день\" и смотришь результаты".
Я так и сделал. Первая ссылка была "Перл за 10 минут". Вот в том объеме я и познал перл. :-)
no subject
Date: 2004-06-09 12:57 am (UTC)no subject
Date: 2004-06-08 01:36 pm (UTC)no subject
Date: 2004-06-08 01:55 pm (UTC)А может, это 64 бита переполнились, я не уверен, на самом деле - не подсчитывал специально.
Есть, начиная с 5.6
Date: 2004-06-08 02:54 pm (UTC)no subject
Date: 2004-06-08 02:54 pm (UTC)no subject
Date: 2004-06-09 02:33 pm (UTC)no subject
Date: 2004-06-08 05:11 pm (UTC)однако
Date: 2004-06-08 06:17 pm (UTC)[al@al al]$ perl -e 'print 1.00000000000000000000000001e26%3,"\n"'
0
[al@al al]$ perl -e 'print 1.00000000000000000000000001e25%3,"\n"'
1
Похоже, проблемы у операции деления по модулю.
no subject
Date: 2004-06-08 07:03 pm (UTC)У неё вообще нет смысла тогда.
Не совсем так
Date: 2004-06-08 08:39 pm (UTC)print 4.001e2%3;
Она у меня возвращает 1:
[al@al -work]$ perl -e 'print 4.001e2%3,"\n";'
1
Причем и на Perl 5.8.4 и на Perl 5.005_03