2012-03-16 15 views
1

iはunsigned char型の計算ハッシュ値のためのコードを有する計算長ここで

#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; 
} 

このハッシュ関数の名前は私が1つを持っている(ボブ・ジェンキンスによって)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) == 1signed charまたはunsigned charでも同じです)。

通常、代わりにstrlenを使用します。

+0

'unsigned char []'なので、 'std :: strlen'の' unsigned char * 'を' const char * 'に変換する必要があると思います(カウントは16ではなく15になります)。 –

+0

@Jesse:Jeffryの答えの優れたアドバイス(+1)をよく理解するには、この[C++ Faq](http://stackoverflow.com/questions/9460260/what-is-the -difference-between-char-a-string-and-char-p-string)エントリを使用します。 –

+0

@Als:私のコメントにC++のFAQが関係しているかどうか分かりません。 –

1

あなたのコードは正しいです。

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

注意文字列が動的でない場合は、このにのみ動作すること:あなたはかかわらず、データ型と比較することもできます。 それ以外の場合は、Cスタイルの文字列にstrlenを使用します。私は言わなければならない

、しかし、C++のstd::stringlengthメソッドを持っており、ほとんどの場合に使用する方がはるかに簡単ですん - STLでそれらを使用する場合は特に。

はまた、boost can do C++ string hashes

0

は、はい、私は、コードが正常に動作することを感じます。しかし、メソッドを通して文字列の配列を渡すと、暗黙的にポインタを渡した関数で配列を渡すので、望む結果が得られないことを確認してください。あなたのコードが災害をもたらすことができる時間。他の賢明なそれは大丈夫です。あなたは文字列配列の長さを見つけることができる他の方法は次のようである:

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

は、次に文字列配列

これが役立つことを願っていますの長さとしてLENを使用しています。

関連する問題