1

string のハッシュからシードを生成する必要があります。このシードは、乱数を生成するために使用されます。おそらく srandom() を使用しますが、この関数は引数として char バッファーを使用せず、整数を使用します。char バッファを使用して srandom をシードできる方法はありますか、またはハッシュ キーから int シードを生成できる他の方法はありますか。あなたが助けてくれることを願っています!

4

4 に答える 4

0
char *hashKey = "helloWorld!"; /* your Hash pointer */

int intHash = 0;
int hashCarry = 0;
for(int i = 0; hashKey[i] != '\0'; i++){

    intHash ^= hashKey[i];  // XORing with current character

    hashCarry = intHash & 0xF0000000; /* getting 4 bits - MSBs */

    intHash <<= 4; // Multiplying it by 16 

    intHash += hashCarry >> 28; /* e.g 0xF0000000 becomes 0x0000000F */
}

srandom(intHash);

お役に立てれば...

上記のコードは、HashKeyビットを破壊しません。

于 2012-11-28T18:30:49.917 に答える
0

initstate(3) を使用できますか?

于 2012-11-28T21:27:20.857 に答える
0

あなたが探しているのは、文字列を数値に解析することですか? もしそうなら、これを試してください:

char buf[] = "12345678";
int number = strtol(buf, NULL, 10);
srand(number);

編集:あなたのコメントから:

MD5を使用してハッシュしています

そして、ハッシュした値を取り戻したいですか?次に、ハッシュの基本的な概念がありません。ハッシュからハッシュ値を取得することはできません。それがポイントです。

于 2012-11-28T17:57:22.033 に答える
0

これまでにコードを投稿していないので、ここでいくつかの仮定を立てています。

char *strHash = "ABCD1234"; // could be anything, i.e. "HelloWorld!"

int intNumberFromHash = 0;
for(int intCurrentCharacter = 0; strHash[intCurrentCharacter] != '\0'; intCurrentCharacter++){
    intNumberFromHash <<= 8; // effectively multiply by 256
    intNumberFromHash += strHash[intCurrentCharacter];
}

srandom(intNumberFromHash);

このコードは、「文字列」から「数値」を生成します。ただし、あまりスマートではありません (つまり、オーバーフローが頻繁に発生し、実際には最後の 4 文字だけで終わることになります)。ハッシュが 16 進値の場合は、おそらく次のようにしたいと思うでしょう。

sscanf(theHash,"%x",number);
srandom(number);

%x修飾子は、16 進数値を小文字の値に変換します (つまり、"abcd1234") 。%X大文字の 16 進数 ("ABCD1234") を実行します。

于 2012-11-28T18:00:35.220 に答える