2014-10-16 76 views
1

如在this問題的意見提出同樣的結果,我使用的哈希函數是:蒂收益率不同的字符串

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 

元的問題:如果一個更好的方法可以建議以獲得更好的哈希函數,我仍然開放在改變我的代碼。

編輯:

strtol()給出了相同的結果。

+0

不使用'strtol()'的具體原因? – 2014-10-16 15:11:29

+0

我想過,但是評論建議'atol()'。讓我看一看。 – gsamaras 2014-10-16 15:12:09

+1

爲了符合'6948614858',你可能需要'strtoll()'或'atoll()' – 2014-10-16 15:24:00

回答

4

這是因爲所提供的電話號碼是太大,不適合在一個整數,因此,atol()不能轉換串好,請致電atol(),以確保沒有錯誤發生轉換時之後檢查errno
在這種情況下,可以嘗試使用功能atoll()來轉換手機號碼,功能atoll()可以適合長整型。