我有很多15位数字。我需要根据设定的顺序重新排列每个字符串中的数字以隐藏复合标识符。例如:将123456789123456转换为223134897616545
我想到的方法是:
- 使用
$array = str_split($int)
提取每个数字 - 使用上述
$array
所需的顺序创建一个新数组
但这就是我被困住的地方。如何将数组的所有数字组合成单个整数?这也是一种有效的方法吗?
我还需要知道它的洗牌顺序,以便检索原始数字。
你已经走了一半。您可以使用join
或implode
:
$no = 123456789123456;
$no_arr = str_split($no);
shuffle($no_arr);
echo join($no_arr); // implode($no_arr);
我随机得到这个:
574146563298123
结果为字符串。您可以通过类型转换转换为 int:echo (int) join($no_arr);
可能更少行的废话:
$num = 1234;
$stringOriginal = (string) $num;
// build the new string, apply your algorithm for that as needed
$stringNew = $stringOriginal[1] . $stringOriginal[0] . $stringOriginal[3] . $stringOriginal[2];
$numNew = (int) $stringNew;
警告:这没有错误处理,很容易弄乱索引并因此出现错误
这似乎是一个混淆(而不是加密(的任务——这意味着你只想掩盖值或使其更难猜测。 事实是,如果您不更改任何字符,而只是将它们洗牌,那么蛮力技术可以很容易地尝试角色的每个组合,以便"发生"正确的角色。
撇开安全性不谈,使用 15 元素数组重新映射字符。 如何生成和存储此地图取决于您。 使用映射将随机字符串恢复为其原始值。
代码:(演示(
$input = '123456789123456';
$map = [5, 8, 13, 2, 4, 11, 0, 14, 1, 7, 3, 12, 10, 6, 9];
$result = '';
foreach ($map as $offset) {
$result .= $input[$offset];
}
echo "Rearranged: $resultn---n";
$reverted = '';
asort($map);
foreach ($map as $offset => $notUsed) {
$reverted .= $result[$offset];
}
echo "Reverted: $reverted";
输出:
Rearranged: 695353162844271
---
Reverted: 123456789123456
内爆数组并将其转换为整数。
(int) implode('',$array)