2016-03-01 83 views
-1

我正在研究一個「證明公平」的網站,讓我們說X參與者進入一個圖形,我們需要選擇第一個總體贏家,但理想情況下,我們也希望從X總共中選出N個子贏家。如何從SHA-256哈希生成N個隨機數

(爲好奇的SHA-256散列將是一個比特幣塊的MERKLE樹根在預先指定的時間)

所以,對於一個SHA-256散列,我們如何產生N個隨機號碼?

我想我知道如何生成1個隨機數(在紅寶石的Fixnum範圍內)。根據這篇文章:http://patshaughnessy.net/2014/1/9/how-big-is-a-bignum

的最大整數長整數是:4611686018427387903

讓我們掐了SHA-256散列的第y個字符。我們可以生成一個,而不是依靠一個比特幣MERKLE根有:

d = Digest::SHA256.hexdigest('hello') 
> "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" 

讓我們的前6個字符,或者:2cf24d

將其改爲10進制:

'2cf24d'.to_i(16) 
> 2945613 

我們現在基於我們的merkle根有一個獨特的Fixnum。

隨着X參與者,讓我們說17,我們決定與獲獎者:

2945613 % 17 
> 6 

因此,假設所有條目知道自己進入的順序,第六參賽者能夠證明他們應該成爲最後的贏家。

現在 - 類似地選擇N個子獲勝者的最佳方式是什麼?假設每個參賽者都應該獲得一個較小但仍有點寶貴的獎勵。

+0

這聽起來像塵土飛揚的非法賭博操作。鏈條當然有足夠的那些。 –

+0

Crypto.SE:[從字節獲取整數](http://crypto.stackexchange.com/questions/8826/map-bytes-to-number),[使用散列作爲PRNG](http:// crypto。 stackexchange.com/questions/9076/using-a-hash-as-a-secure-prng)。這些都是件,現在去享受打破法律的樂趣。在你被捕之前儘量不要被黑客入侵。 –

回答

0

爲什麼不只是使用散列的種子?

[*1..17].shuffle(random: Random.new(0x2cf24d)) 
# => [15, 5, 9, 7, 14, 3, 16, 12, 2, 1, 17, 4, 6, 13, 11, 10, 8] 
[*1..17].shuffle(random: Random.new(0x2cf24d)) 
# => [15, 5, 9, 7, 14, 3, 16, 12, 2, 1, 17, 4, 6, 13, 11, 10, 8] 

編輯:這是依賴於Ruby的版本,但 - 我相信shuffle是JRuby和MRI之間的不同,即使Random產生相同的序列。你可以通過自己實現shuffle來規避這種情況。有關更多詳細信息,請參見this question。這個解決方法對於我來說在JRuby和MRI上都一致:

r = Random.new(0x2cf24d) 
[*1..17].sort_by { r.rand } 
# => [14, 11, 4, 10, 1, 3, 9, 13, 16, 17, 12, 5, 8, 2, 6, 7, 15] 
r = Random.new(0x2cf24d) 
[*1..17].sort_by { r.rand } 
# => [14, 11, 4, 10, 1, 3, 9, 13, 16, 17, 12, 5, 8, 2, 6, 7, 15]