2017-03-08 68 views
1

我有一個結構:Ç - 散列結構與unsigned int類型的屬性氮量

struct A 
{ 
    unsigned int a, b, c, d, ...  
} 

我想打一個函數:

unsigned int A_hash(const A* const var) 
{ 

    return ... 
} 

數退回需求是非常非常大如果A_hash(var) < myHashTable.capacity,HashTable插入的模數將無法正常工作。

我看到了這樣的問題,像以前一樣「散列函數,它在兩個整數」,「散列函數需要五個整數」等但對於n整數?我正在尋找一個更通用的算法體面的哈希。它不需要是企業級的。

我在想或許還有一個龐大的數字開始像

return (0x7FFFFFFFF & a) + (0x7FFFFFFFF & b) + ...

,但我不認爲這將是足夠好。我也不知道如何阻止溢出的A_hash函數,但這可能是另一個問題。

+1

對待你的結構作爲一個連續的數組字節和使用Adler-32或其他滾動校驗和 – bruceg

回答

1

我想隱式地問你如何可以像處理一個長字節流一樣處理整個對象,就像@bruceg解釋的那樣。如果我錯了,那麼你可能會忽略這個答案,因爲這是我要解決的。請注意,此解決方案不僅適用於散列,而且適用於任何需要將字節視爲數據的內容(例如從內存或文件複製/寫入)。

我認爲你正在尋找的只是逐字節讀取。爲此,你可以從std::ostream::write(儘管這是一種C++方法)自學。例如,你可以以這樣的方式,你可以調用它是這樣寫A_hash

int hash = A_hash((char*)&a, sizeof(a)); // where 'a' is of type 'struct A'. 

你可以寫A_hash,例如,像這樣:

unsigned int A_hash(char* data, unsigned int dataSize) 
{ 
    unsigned int hash = someValue; 

    for (unsigned int i = 0; i < dataSize; ++i) 
    { 
     char byte = data[i]; 
     doSomethingWith(hash); 
    } 

    return hash; 

} 

這種方法的最大優點是你不需要重寫函數,如果你添加/刪除字段到你的結構; sizeof(A)將在編譯時擴展/縮小。另一個巨大優勢是,它適用於任何價值,因此可以重用你想要的任何類型,包括int,另一struct,一個enum,指針,這個函數......

相關問題