說我有16個值8個表:一套保證唯一的整數組合的LUT
uint32_t lut[8][16];
我想,以填補這些表值,使得合併(添加,EOR,等等)從每個進入這八個表將產生一個唯一的32位值 - 與任何其他條目組合的結果不同。
也就是說,隨機變量i
,j
,k
,l
,m
,n
,o
和p
,我想從lut[0][i] + lut[1][j] + lut[2][k] + lut[3][l] + lut[4][m] + lut[5][n] + lut[6][o] + lut[7][p]
所有這些變量可以有不同的價值觀的獨特成果。雖然組合操作不一定是加號。
總共有16**8
(40億)個輸入組合,並且每個輸入的結果必須是不同的。
此外 - 這是很難的部分 - 我希望這些條目出現隨機。
明顯的答案是:
uint32_t lut[8][16] = {
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
{ 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60 /* ... */ },
{ 0x000, 0x100, 0x2000 /* ... */ },
/* ... */
};
而且我們可以證明它與:
for (uint64_t x = 0; x < 0x100000000; x++) {
uint32_t y = 0;
for (int i = 0; i < 8; i++) {
y += lut[i][(x >> (i * 4)) & 15];
}
assert(x == y);
}
但是,這不是隨機的一切!
我可以這樣做:
for (int i = 0; i < 8; i++) {
shuffle(lut[i], 16);
}
這有助於一點,但不多。
我最終做的是上面的例子中的一堆轉換。任何1:1 線性我可以對組合值執行變換以使其「更隨機」,可以在表格元素上提前執行,如果我得到的結果與之後完成的結果相同那麼我已經證明,每個可能的組合仍然會產生一個唯一的值(因爲它在變換之前)。但是,這種方法有一些侷限性。所以我想知道;是否有另一種方法來使這些表與給定的約束隨機化?
爲什麼不做「反向操作」呢?選擇8個隨機的32位值,然後將它們中的每一個「拆分」到相應索引處的表中。 –
@barakmanos表中有40億(16的8次冪)可能的表組合,所以當我通過表分配32位結果時,我必須考慮它的塊如何與來自不同表項的不同選擇交互;我不知道該怎麼做。 – sh1