我需要从字符串的散列生成种子。这个种子将用于生成随机数,我可能会使用 srandom(),但是这个函数不将 char 缓冲区作为参数,它需要一个整数。有什么方法可以使用 char 缓冲区播种 srandom,或者有任何其他方法可以从哈希键生成 int 种子。希望你能帮忙!
问问题
221 次
4 回答
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);
此代码将从“字符串”生成“数字”。然而,它不是很聪明(即它会经常溢出,最后只有最后四个字符真正做任何事情)。如果哈希是十六进制值,您可能想要做这样的事情。
sscanf(theHash,"%x",number);
srandom(number);
该%x
修饰符会将十六进制值转换为小写值(即“abcd1234”)。%X
将做大写十六进制(“ABCD1234”)。
于 2012-11-28T18:00:35.220 回答
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 回答