|
Тема |
Разделяне на низ |
|
Автор |
peio (one of my turns) |
|
Публикувано | 06.05.03 18:29 |
|
|
Здравейте,
имам следния проблем : поставил съм си за цел да разделя един низ (парола) между N човека , като условието е да са нужни само M от тях, за да се събере низа отново. Първото решение, което приложих е да раздавам всеки символ от низа на M различни човека, но по този начин трябва да дам по (N+1 - М) / N част от низа на всеки отделен човек, което означава, че празните позиции във всяка част от ключа могат лесно да бъдат запълнени чрез обхождане на всички възможности. Тъй като начина, който съм изложил по-долу, ми дава възможност да го приложа към произволно дълъг низ, то аз мога да използвам толкова дълъг низ за парола, че празните позиции във всяко парче да са достатъчно много за да обезмислят услията за запълване чрез обхождане то той според мен е приложим само ако паролата, която деля, е симетрична и дължината си я определям единствено аз. Проблемът идва ако низа, който деля е частния ключ от асиметрина двойка, който е с фиксирана максимална големина. Тогава вече опастността от опит за обхождане на всички възможности е реална.
Въпросът ми е какъв друг начин мога да използвам за да постигна същата цел ?
Ето сегашното решение на проблема, което не е особено блестящо, но се спрях до тук поради горните съображения :
<?php
function keysplit($Persons, $Parts){
global $str;// въпросната парола/ключ
$rPersons = ($Parts+1) - $Persons;
$nLoop = 0;
for($nSymbol=0 ; $nSymbol < strlen($str) ; $nSymbol++){
$startElement = $nSymbol - ($Parts*$nLoop);
for($i=0 ; $i < $rPersons ; $i++){
$resultElement = $startElement + $i;
if($resultElement > $Parts)
$resultElement = $resultElement % $Parts;
elseif($resultElement == 0)
$resultElement = $Parts;
$result[$resultElement] .= $str[$nSymbol];
}
for($j = 0; $j < ($Parts-$rPersons); $j++){
$emptyElement = $startElement+$rPersons+$j ;
if($emptyElement > $Parts)
$emptyElement = $emptyElement % $Parts;
elseif($startElement == 0)
$emptyElement = $rPersons+$j;
$result[$emptyElement] .= "_";
}
if( ($nSymbol % $Parts) == 0 and $nSymbol != 0)
$nLoop++;
}
return $result;
}
?>
# лудите, лудите... те да са живи!
|
| |
|
|
|