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