我正在研究一個「證明公平」的網站,讓我們說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個子獲勝者的最佳方式是什麼?假設每個參賽者都應該獲得一個較小但仍有點寶貴的獎勵。
這聽起來像塵土飛揚的非法賭博操作。鏈條當然有足夠的那些。 –
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)。這些都是件,現在去享受打破法律的樂趣。在你被捕之前儘量不要被黑客入侵。 –