2012-03-16 113 views
1

這裏我有無符號字符名稱該散列函數的計算長度

#include <cstdlib> 
#include <iostream> 
#include<string.h> 
using namespace std; 

unsigned oat_hash(unsigned char *key,int len) 
{ 
    unsigned char *p=key; 
    unsigned h=0; 
    int i; 
    for(i=0;i<len;++i){ 
     h+=p[i]; 
     h+=(h<<10); 
     h^=(h>>6); 
    } 
    h+=(h<<3); 
    h^=(h>>11); 
    h+=(h<<15); 

    return h; 
} 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    unsigned char mystring[]="123456789abcdef"; 
    unsigned char *key=&mystring[0]; 
    int n=sizeof(mystring)/sizeof(mystring[0]);//length of mystring 
    cout<<oat_hash(key,n)<<endl; 
    //system("PAUSE"); 
    //return EXIT_SUCCESS; 
    return 0; 
} 

的計算散列值的代碼是所謂的單在-A-時間散列(由Bob詹金斯)1具有一個問題是這部分代碼正確嗎?

int n=sizeof(mystring)/sizeof(mystring[0]);//length of mystring 

因爲mysting沒有內置功能長度,我用這個

回答

3

在這種情況下,是的 - 但它是很脆弱的。

unsigned char mystring[]="123456789abcdef"; 

爲:舉例來說,如果你改變了你的定義

unsigned char *mystring="123456789abcdef"; 

你找到長度會產生完全不正確的結果的方法。還要注意,由於您的字符串是由char到了,該/sizeof(mystring[0])是不是真的有必要要麼 - sizof(char) == 1(與同爲signed charunsigned char)。

您通常要使用的strlen代替。

+0

因爲它是'無符號的字符[]',我相信你會需要'無符號字符*'轉換爲'爲const char *''對的std :: strlen'(也,則將被計爲15而不是16)。 – 2012-03-16 06:08:12

+0

@Jesse:要充分認識在傑弗裏的答案(+1)的優秀建議,您可能想看看這個[C++ FAQ(http://stackoverflow.com/questions/9460260/what-is-the -char-a-string-and-char-p-string)條目。 – 2012-03-16 07:23:14

+0

@Als:我不確定C++常見問題與我的評論有什麼關係。 – 2012-03-16 08:20:15

1

呀,你的代碼是正確的。您可能需要進行比較的數據類型,但:

int n=sizeof(mystring)/sizeof(char); //length of mystring 

請注意,此只能如果字符串不是動態。 否則使用strlen對於C風格的字符串。

我必須要說然而,C++的std::string確實length方法,而且更容易在大多數情況下使用 - 與STL使用它們時更是如此。

此外,boost can do C++ string hashes

0

是的,我覺得這個代碼將正常工作。但要確保如果你通過一個方法傳遞一個字符串數組,它不會給你想要的結果,因爲傳遞數組在隱式地通過指針傳遞的函數中。那時候你的代碼可能會造成災難。其他方面,這很好。你可以找到一個字符串數組的長度另一種方法是這樣的:

int len = 0; 
int iCount = 0; 
while (mystring[iCount].empty() != true) 
{ 
     iCount++; 
     len++; 
} 

然後使用LEN作爲String數組

希望這將有助於長度。