2012-03-16 3 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; 
} 

имени этого хэш-функция так называется One-на-время хэша (Боб Jenkins) У меня есть один вопрос в том, что эта небольшая часть кода правильная?

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

потому mysting не встроенная функция длины, я использовал этот

ответ

3

В этих условиях, да - но это довольно хрупкая. Например, если вы изменили свое определение от:

unsigned char mystring[]="123456789abcdef"; 

To:

unsigned char *mystring="123456789abcdef"; 

Ваш метод нахождения длины будет производить совершенно неправильные результаты. Также обратите внимание, что поскольку ваша строка состоит из char s, то /sizeof(mystring[0]) также не требуется - sizof(char) == 1 (и то же самое для signed char или unsigned char).

Вместо этого вы обычно используете strlen.

+0

Поскольку это 'unsigned char []', я считаю, что вам нужно будет преобразовать 'unsigned char *' в 'const char *' для 'std :: strlen' (также, счет будет 15 вместо 16). –

+0

@Jesse: Чтобы полностью понять отличный совет в ответе Джеффри (+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 

Обратите внимание, что это работает только, если строка не является динамическим. В противном случае используйте strlen для строк c-style.

Я должен сказать, однако, C++ 's 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 как длина массива Струнный

Надежда это поможет.

Смежные вопросы