Не уверен, насколько «тяжелым» он вам нужен, как быстро или как мало памяти для использования. Если у вас нет ограничений памяти, вы можете составить список всех целых чисел, перемешать их и использовать этот список в качестве отображения. Однако даже для 4-байтового целого вам потребуется много памяти.
Однако это можно сделать меньшим, поэтому вместо отображения всех целых чисел вы должны отобразить только 2 (или худший случай 1) байта и применить это к каждой группе в целом числе. Таким образом, используя 2 байта, целое число будет равно (group1) (group2) , вы будете отображать каждую группу через случайную карту. Но это означает, что если вы измените только group2, то сопоставление для group1 останется прежним. Это можно «исправить», сопоставляя разные биты каждой группе.
Итак, * (group2) может быть (бит 14,12,10,8,6,4,2,0), поэтому добавление 1 приведет к изменению group1 и group2 .
Тем не менее, это только защита от неясности, любой, кто может вводить числа в вашу функцию (даже если вы храните функцию в секрете), может довольно легко понять это.