2015-05-04 43 views
0

我一直在嘗試實現簡單的哈希方法,它與正整數完美協作,但它與負數崩潰。這裏的代碼:實現自定義哈希類,但它導致程序崩潰與負整數

void HashTable::insert(long long int key){ 
    //hash function: h(k) = k mod (p) 
    long long int hash = key % tableSize; 

     while (hashTable[hash] != NULL){ 
      // Change hash value to next position (+1) 
      hash = (hash + 1) % tableSize; 
     } 

     hashTable[hash] = key; 
} 

問題是,當結果爲負值時,mod的結果爲負值,並導致程序崩潰。它在我獲得它的絕對值時起作用,但是我不確定它是否是正確的方法。

有什麼建議嗎?

編輯:這裏是類:

class HashTable{ 

private: 
    long int tableSize; 
    long long int *hashTable; 

public: 

    HashTable(long int); 
    void insert(long long int); 
}; 
+0

顯示已使用變量的聲明。 – Blacktempel

+0

'boost :: unordered_map'。 – Puppy

+0

@Blacktempel將該類添加到OP – Kronos

回答

0

只要把你的密鑰unsigned - 無需進行額外的操作只是爲了獲得一個正數:

void HashTable::insert(uint64_t key){ 
    //hash function: h(k) = k mod (p) 
    uint64_t hash = key % tableSize; 

    // rest as before 
} 

另外,如果你讓你的tableSize成員unsigned,那麼%運營商的結果也將是unsigned

+0

因此,即使我使用abs(鍵)使其爲正數,這是處理負數的正確方法嗎? – Kronos

+0

@Kronos絕對沒有任何邏輯上與'abs()'有關。只是提出可能更快的替代解決方案。 – Barry