使用 SecureRandom 生成唯一的随机值
Generating unique random values with SecureRandom
我目前正在实施秘密共享计划。(shamir)
为了生成一些秘密共享,我需要生成一些范围内的随机数。为此,我有这个非常简单的代码:
val sharesPRG = SecureRandom()
fun generateShares(k :Int): List<Pair<BigDecimal,BigDecimal>> {
val xs = IntArray(k){ i -> sharesPRG.nextInt(5)}
return xs
}
我省略了实际创建共享作为坐标的部分,只是为了使其可重现,并选择了一个任意小的 5 的界限。
我的问题是我当然需要这些份额是唯一的,拥有相同的份额是没有意义的。
那么 Securerandom.nextint 是否有可能不 return 它已经 return 的值?
当然我可以在检查重复项的地方做一些逻辑,但我真的认为应该有更优雅的东西
如果您的 k
不是太大,您可以继续向集合中添加随机值,直到达到大小 k
:
fun generateMaterial(k: Int): Set<Int> = mutableSetOf<Int>().also {
while (it.size < k) {
it.add(sharesPRG.nextInt(50))
}
}
然后您可以使用该集合作为源 material 到您的配对列表(k
需要是偶数):
fun main() {
val pairList = generateMaterial(10).windowed(2, 2).map { it[0] to it[1] }
println(pairList)
}
我目前正在实施秘密共享计划。(shamir) 为了生成一些秘密共享,我需要生成一些范围内的随机数。为此,我有这个非常简单的代码:
val sharesPRG = SecureRandom()
fun generateShares(k :Int): List<Pair<BigDecimal,BigDecimal>> {
val xs = IntArray(k){ i -> sharesPRG.nextInt(5)}
return xs
}
我省略了实际创建共享作为坐标的部分,只是为了使其可重现,并选择了一个任意小的 5 的界限。 我的问题是我当然需要这些份额是唯一的,拥有相同的份额是没有意义的。 那么 Securerandom.nextint 是否有可能不 return 它已经 return 的值? 当然我可以在检查重复项的地方做一些逻辑,但我真的认为应该有更优雅的东西
如果您的 k
不是太大,您可以继续向集合中添加随机值,直到达到大小 k
:
fun generateMaterial(k: Int): Set<Int> = mutableSetOf<Int>().also {
while (it.size < k) {
it.add(sharesPRG.nextInt(50))
}
}
然后您可以使用该集合作为源 material 到您的配对列表(k
需要是偶数):
fun main() {
val pairList = generateMaterial(10).windowed(2, 2).map { it[0] to it[1] }
println(pairList)
}