想象一下,我可以使用類似Knuth shuffle和帶有種子鍵的種子隨機數生成器來洗牌0到2^32之間的所有數字。隨機置換中第n項的高效計算
在概念上,我會(使用Ž 代替ž爲了簡潔)需要兩個數組:
[2, 0, 1, 4, 3] // perm
[1, 2, 0, 4, 3] // inv === p^-1
如果我有這些陣列,我可以有效地查找排列中的第n個元素以及查找purmutation值v中的元素;
v = perm[n];
n == inv[v]; // true
我不想存儲UINT表示此洗好的一組,因爲我在任何時候整個打亂順序從不感興趣兩個16 GB陣列。我只對第n個元素的價值感興趣。
我非常想要寫兩個是這樣工作的純函數:
uint nthShuffled = permutate<uint>(key, n); // O(log n)
uint n == invert<uint>(key, nthShuffled); // O(log n)
要求:
- 每32名值映射到唯一不同的32位值。
- 排列中前100個元素的知識不能提供關於排列中第101個元素的信息。
據我所知,理論上必須至少有2 !唯一的鍵來表示任何可能的排列,但我相信我可以在實踐中隱藏這個問題後面的一個好的散列函數。
那裏有什麼東西可以接近這個嗎?
歡迎來到Stack Overflow!如果您想從加密的角度(而不是在C++部分)更多地考慮這個問題,那麼對於姊妹站點[Cryptography Stack Exchange](http://crypto.stackexchange.com/)來說這將是一個很好的問題。 (我是主持人)。如果你也這麼認爲,你可以將它標記出來讓SO版主遷移它(使用「需要管理員注意力」並輸入自定義標誌原因)。 –