2016-10-19 6 views
1

djb2ハッシュ関数に機能を追加しようとしましたが、変更が気に入らないようです。特に、私は単語(文字列)を小文字に変換するループを含めることを試みています。これは、次の2つのエラーをスロー:int ハッシュ関数の問題 - 機能の追加

  • からchar *に割り当てるポインタへの変換

    1. 互換性のない整数は、元のコード*str++whileループに現れたタイプchar *[45]

    注の値をインクリメントすることはできません。 。これは私の最初のハッシュテーブルですが、私はポインタについてはかなり不安です。私が間違っていた箇所についての洞察は高く評価されます。

    // djb2 by Dan Bernstein -- slightly modified; 
    unsigned int hash_function(const char* str) 
    { 
        unsigned int hash = 5381; 
        int c; 
        char* string[45]; 
    
        for (int i = 0; str[i] != '\0'; i++) 
        { 
         string[i] = (tolower(str[i])); 
        } 
    
        while (c == *string++) 
         hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 
    
        return (hash % LISTS); 
    } 
    
  • 答えて

    1

    より効率的なバージョン:返信&明確化のため

    unsigned int hash_function(const char* str) 
    { 
        unsigned int hash = 5381, c; 
        while(c = *str++) 
         hash += (hash << 5) + (c | 040); 
    
        return (hash % LISTS); 
    } 
    
    +0

    非常に感謝しています!私はこれがオリジナルの改訂版であり、すべてを小文字に変換しないと思いますか?好奇心の中で、(c | 040)は何を意味するのですか。文字とビットORの組み合わせは珍しいようです。私は最近、ビットレベルで作業を始めました。これは、クールでありながら、心の痛みでもあります@#$&%。 – Ryan

    +1

    (x | 040)は "x"を小文字に変換し、数字を変更しません。しかし、いくつかのCTRL記号を印刷可能なものに変更します。ただし、これはハッシングの目的には重要ではありません。 – maxihatop

    1

    この:

    char* string[45]; 
    

    は "45の文字ポインタの配列" を意味し、アスタリスクをドロップする必要があります。

    変数をインクリメントして配列を反復処理することはできません。配列変数は変更できません。 ==はあなたが何を意味するかではない平等のための比較である一方、割り当ては、=綴られていること

    const char *s = string; 
    while (c = *s++) 
    

    注:あなたは別のポインタを使用することができます。あなたのハッシュの

    +0

    多くの感謝!私はそれをショットを与えるよ! – Ryan

    関連する問題