如何从SHA-256哈希

时间:2016-03-01 01:53:19

标签: ruby bitcoin

我正在做一个可证明公平的事情。让我们说X参与者进入绘图的网站,我们需要选择前1位获胜者,但理想情况下我们还想从X总数中选出N个获胜者。

(好奇的是,SHA-256 Hash将是预先指定时间比特币块的merkle树根)

因此,给定一个SHA-256哈希,我们如何生成N个随机数?

我想我知道如何生成1个随机数(在ruby&#39的Fixnum范围内)。根据这篇文章:http://patshaughnessy.net/2014/1/9/how-big-is-a-bignum

最大Fixnum整数是:4611686018427387903

让我们选择SHA-256哈希的前Y个字符。我们可以生成一个而不是依赖比特币merkle root:

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

我们取前6个字符,或者:2cf24d

将此转换为基数10:

'2cf24d'.to_i(16)
> 2945613

我们现在有一个基于myrkle root的独特Fixnum。

对于X参与者,让我们说17,我们决定胜利者:

2945613 % 17
> 6

因此,假设所有参赛作品都知道他们的参赛顺序,那么第六名参赛者可以证明他们应该是胜利者。

现在 - 同样挑选N个获胜者的最佳方法是什么?让我们说每个参赛者都应该获得一个更小但仍然有价值的奖品。

1 个答案:

答案 0 :(得分: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]