2012-11-28 21 views
1

我需要從一個字符串的散列生成一個種子。這個種子將被用來生成隨機數,我可能會使用srandom(),但是這個函數並不是一個char緩衝區的參數,它需要一個整數。有沒有什麼方法可以使用char緩衝區來播種srandom,或者有什麼其他方法可以通過散列鍵生成int種子。希望你能幫助!用字符緩衝區播種srandom

+0

什麼是散列值的類型? –

+0

我正在使用MD5對它進行散列,輸出在char類型的緩衝區中返回 –

+0

您是在強大的安全性之後,還是隻是一個快速的黑客? –

回答

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位。

0

正在將一個字符串解析成你正在尋找的數字嗎?如果是的話,試試這個:

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

編輯:從您的評論:

我使用MD5哈希它

你想回到你散列值?那麼你錯過了哈希的基本概念。你不能從哈希中取回哈希值,這就是要點。

+0

我刪除了我的答案,尋找更好的答案,但是'sscanf'的問題是什麼,我用'strtol'對不起,但是你可以稍微詳細一點嗎? – Omkant

+0

@Omkant'sscanf(buffer,「%d」,number);''會調用未定義的行爲,因爲scanf()需要一個指向其輸出參數的指針。 'strtol()'函數是字符串到整數轉換的標準方式。 – 2012-11-28 18:02:05

+0

好吧,我已經使用了'&number',謝謝 – Omkant

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」)。

0

你可以使用initstate(3),還是我錯過了什麼?