2014-10-16 3 views
1

как предложено в комментариях this вопрос, я использую в качестве хэш-функции это:Atol дает те же результаты для различных строк

atol(phone) % buckets 

Однако, я получил тот же самый точный результат от atol() для всех моих телефонных номеров ! Я удалил первые две цифры (они одинаковы для всех чисел в моем случае) и получили разные результаты (конечно, столкновения были обнаружены ..).

Почему это произошло?

Проверьте выход из этого:

printf("%s %ld %ld %s %ld %d %ld\n", str, atol(str), atol(str) % N, 
     phone, atol(phone), N, atol(phone) % N); 

Просто некоторые примеры:

48614858 48614858 58 6948614858 2147483647 200 47 
61468264 61468264 64 6961468264 2147483647 200 47 
54079694 54079694 94 6954079694 2147483647 200 47 
48370923 48370923 123 6948370923 2147483647 200 47 
52746354 52746354 154 6952746354 2147483647 200 47 

Мета-вопрос: Если лучший подход может быть предложено, чтобы получить лучшую хеш-функции, я все еще открыт в изменении моего кода.

EDIT:

strtol() дает те же результаты.

+0

любая конкретная причина не использовать 'strtol()'? –

+0

Я думал об этом, но комментарии предлагали 'atol()'. Дай взглянуть. – gsamaras

+1

, чтобы соответствовать '6948614858', вам может понадобиться' strtoll() 'или' atoll() ' –

ответ

4

это потому, что при условии, номер телефона слишком велик, чтобы поместиться в целом, таким образом, atol() не может преобразовать строку хорошо, пожалуйста, проверьте errno после вызова atol(), чтобы убедиться, что нет ошибок происходят во время преобразования.
В этом случае вы можете попробовать использовать функцию atoll() для преобразования номера телефона, функция atoll() может соответствовать длинному длинному целому числу.

 Смежные вопросы

  • Нет связанных вопросов^_^