我正在设计一个排序过程/算法,它会对列表中的项进行混洗,但要根据输入的哈希值进行唯一操作;因此,当相同的输入 - 基本上是密码短语 - 被散列或处理时,再现相同的精确混洗。这需要有能力独特地改变26 ^ 4件事(应用程序正在配对两个列表,每个列表长度为26 ^ 4,但它只需要将其中一个列入其中一个)。
这可能是一件事吗?
答案 0 :(得分:2)
您可以将输入的哈希值用作随机数生成器的种子,然后使用该哈希值来执行混洗。如果两个输入相同(具有相同的散列),则RNG以相同的方式播种,导致相同的混洗。
答案 1 :(得分:0)
如果您有26 ^ 4个项目,则大约有10 ^ 240000个可能的排列,需要至少100万个字符(或左右)的密码才能使排列保证唯一。所以不,不是真的。
但是!如果您只是想根据密码短语进行无法预测的置换,只需将其哈希,使用结果作为PRNG的种子,然后使用PRNG对项目进行标准(Fisher-Yates)随机播放。结果将是独特的,虽然不是加密强。
答案 2 :(得分:0)
一种方法是使用种子值作为排列索引。也就是说,给定一些种子值m
,您可以生成那些26 ^ 4个元素的m th 排列。
例如,数字1到3的可能排列是:
123,132,213,231,312,321
然后,第四个排列是231。
Eric Lippert在一段时间内做了一系列关于产生排列的系列文章。本系列的第四篇文章展示了如何生成m th 排列。请查看https://ericlippert.com/2013/04/25/producing-permutations-part-four/
代码示例在C#中,但解释和代码足够清楚,以任何其他语言实现应该是直截了当的。
如果种子的范围小于可能的排列总数(26 ^ 4),这种技术将保证每个种子的排序(排列)不同!。