« 1 2 »
Autor Zpráva
Silver8000
Profil
Toto je velice specificka otazka a pres google jsem ji totiz nenasel tak me tam prosim neodkazujte.
Ahoj mam dotaz na bud nejakou funkci nebo vytvoreni nejakeho ciklu ve kterem kdyz nastavim treba cislo 2 tak se 2x mezi s sebou vynasobi cislo 36..(36*36=1296) a kdyz to nastavim na 3 a vice tak se to ma vicekrat mezi s sebou vynasobit zalezi podle nastaveneho cisla ale kdyz tam bude cislo 1 tak se to nasobit nebude jelikoz ta hodnota 36 tam bude pouze jednou.
Proc zrovna 36 ?
Protoze array obsahuje 36 znaku(zalezi na nastaveni funkce udane nize).
$characters = array_merge(range('A','Z'), range('0','9'));
echo count($characters);
Jde mi o to abych vypocital kolikrat se muze opakovat kazdy znak a vypocital konecny pocet ve funkci:

function generate_code($default_number=1,$default_code_type=5){
if ($default_code_type==1){
$characters = array_merge(range('A','Z'), array());
}
if ($default_code_type==2){
$characters = array_merge(range('a','z'), array());
}
if ($default_code_type==3){
$characters = array_merge(range('0','9'), array());
}
if ($default_code_type==4){
$characters = array_merge(range('A','Z'), range('a','z'));
}
if ($default_code_type==5){
$characters = array_merge(range('A','Z'), range('0','9'));
}
if ($default_code_type==6){
$characters = array_merge(range('a','z'), range('0','9'));
}
if ($default_code_type==7){
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
}
//print_r($characters);
$code='';
for ($i = 0; $i < $default_number; $i++) {
    $rand = mt_rand(0, count($characters)-1);
    $code .= $characters[$rand];
}
return $code;
}
Pro testovani mam zatim nastaveno nejnizsi pocet $default_number=1(Kolikrat se muze opakovat stejne cislo nebo pismenko.)
Priklad pouziti funkce :
echo generate_code();
Poznamka:
Tato funkce slouzi k nahodnemu generovani Alfa,Alfa numerickeho nebo jen numerickeho kodu.

Dam vam priklad :
kdyz budu chtit aby se toto kodovani pouzilo jako ID prizpevku a jelikoz tam je ted nastaveno cislo jedna tak konecny pocet prizpevku v DB MySql bude 36.
Coz jednoduse znamena ze muzu mit maximalne 36 prizpevku v databazi.
Rozdil mezi $default_number=1 a $default_number=8 je ohromny,obzvlast kdyz nastavim $default_code_type=7.
Doufam ze jste me pochopili a dekuji za jakekoliv rady.
PS:
Zkousel jsem funkci implode ale to mi vypisuje 36*36 misto toho aby se to vypocitalo.
Upraveny kousek kodu z funkce :
$code='';
$code_array = array();
for ($i = 0; $i < $default_number; $i++) {
$count = count($characters);
$code_array[] = $count; 
    $rand = mt_rand(0, $count-1);
    $code .= $characters[$rand];
}
$code_count = implode("*",$code_array);
echo $code_count;
mimochodec
Profil
$x = pow(2, 3)  // = 2 * 2 * 2
$x = pow(2, 5)  // = 2 * 2 * 2 * 2 * 2
$x = pow(4, 10)  // = 4 * 4 * 4 * 4 * 4 * 4 * 4 * 4 * 4 * 4

Ta velice specifická funkce se jmenuje mocnina.


Ještě dodatek. Nevím přesně, jaký je účel toho výpočtu, ale pokud ta funkce má být volaná nějak častěji, doporučil bych řádky
$characters = array_merge(range('A','Z'), array());
atd. nahradit prostě řetězcem, který si vytvoříš jednou. Myslím, že se můžeš spolehnout na to, že range('A','Z') apod. se opravdu nikdy nezmění. Tak jaks to napsal ty, se to pokaždé zbytečně počítá.

Druhá věc:
kdyz budu chtit aby se toto kodovani pouzilo jako ID prizpevku

Jestli chceš generovat ID při vkládání řádků do databáze, je to špatně. Jediný správný postup je ten, že sloupci ID nastavíš auto_increment a o unikátnost řádků se postará databáze sama. Jestli chceš unikátní nečíselný řetězec, spoléhat na to, že 36^5 je velké číslo, je špatně. Ten tvůj druhý uvedený kousek kódu je snad v principu správně, jen nerozumím, proč nakonec místo $code pracuješ s nějakým $code_count. A především ti tam chybí ověření proti databázi, jestli už tam ten kód není použit.
Silver8000
Profil
mimochodec:
proč nakonec místo $code pracuješ s nějakým $code_count
protoze to ted potrebuji vypocitat,jinak dik funkce pow() funguje bezva.
Jo a kdyby te zajimalo proc to chci pocitat tak to je proto abych pozdeji zjistil jestly v databazi je jeste misto pro vygenerovani noveho kodu a jestli databaze uz neni zaplnena vsemi moznostmi.
Jestli chceš generovat ID při vkládání řádků do databáze, je to špatně.Jediný správný postup je ten, že sloupci ID nastavíš auto_increment
Chapu ale ja to ID tam budu mit nastavene na auto_increment jen misto toho muzu pouzit vygenerovany kod ktery bude v dalsim sloupecku te stejne tabulky.

upravena funkce :
<?php
function generate_code($default_number=2,$default_code_type=5){
if ($default_code_type==1){
$characters = range('A','Z');
}
if ($default_code_type==2){
$characters = range('a','z');
}
if ($default_code_type==3){
$characters = range('0','9');
}
if ($default_code_type==4){
$characters = array_merge(range('A','Z'), range('a','z'));
}
if ($default_code_type==5){
$characters = array_merge(range('A','Z'), range('0','9'));
}
if ($default_code_type==6){
$characters = array_merge(range('a','z'), range('0','9'));
}
if ($default_code_type==7){
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
}
//print_r($characters);
$count_characters = count($characters);
$count_range = pow($count_characters, $default_number);
$code='';
for ($i = 0; $i < $default_number; $i++) {
    $rand = mt_rand(0, $count_characters-1);
    $code .= $characters[$rand];
}

return array('code_gen'=>$code,'range'=>$count_range);
}
//pouziti
print_r(generate_code());
?>

tady mam i testovaci tabulku do DB:
DROP TABLE IF EXISTS `code_generator`;
CREATE TABLE IF NOT EXISTS `code_generator` (
  `code_id` int(4) NOT NULL AUTO_INCREMENT,
  `code_generated` varchar(30) NOT NULL,
  PRIMARY KEY (`code_id`),
  UNIQUE KEY `code_generated` (`code_generated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

no a ted ta dalsi otazka jak muzu zajistit generovani kodu tak aby kdyz se bude stejny kod opakovat aby se vygeneroval novy pripadne ze i ten vygenerovany existuje vygenerovat novy <- a tak by jsem to mohl psat do nekonecna
vim jen ze IF,else se to da ale potrebuji neco co my to zjednodussi protoze nemuzu donekonecna psat if a else.
if($code_found==true){
//if,else atp.
}else{
//return code.
}
Tori
Profil
Silver8000:
Jo a kdyby te zajimalo proc to chci pocitat tak to je proto abych pozdeji zjistil jestly v databazi je jeste misto pro vygenerovani noveho kodu a jestli databaze uz neni zaplnena vsemi moznostmi.
Tak přece víte, jaký datový typ jste sloupci ID (auto_inc) nastavil, tak si najděte max. hodnotu toho typu a použijte ji jako konstantu ve skriptu. Jestli chcete ještě paralelně s ID používat něco dalšího, co vypadá jako "kód" a zároveň to je unikátní, tak používejte třeba SHA1 hash toho auto_inc. ID.
mimochodec
Profil
Silver8000:
no a ted ta dalsi otazka jak muzu zajistit generovani kodu tak aby kdyz se bude stejny kod opakovat aby se vygeneroval novy pripadne ze i ten vygenerovany existuje vygenerovat novy <- a tak by jsem to mohl psat do nekonecna

function getkod() {
  $chars = "abcdefghijkmnpqrstuvwx0123456789";
  $length = 5;
  $existuje = 1;

  while ($existuje>0) {
    $ret = "";

    for ($i = 0; $i < $length; $i++) {
      $ret .= $chars[mt_rand(0,strlen($chars))];
    }

    $existuje = mysql_result(mysql_query("SELECT COUNT(*) FROM tbl WHERE kod = '".$ret."'"), 0);
  }

  return $ret;
}
Silver8000
Profil
Tu funkci jsem prispusobil na moji tabulku a vypada to ze je plne funkcni.
Musel jsem odstranit 3 moznosti protoze napriklad kdyz jsem nechal generovat pouze numericky kod tak me to nechtelo vkladat nuly do DB.
Upravena funkce :
function generate_code($mysqli,$default_code_length=8,$default_code_type=2) {
if ($default_code_type==1){
$characters = array_merge(range('A','Z'), range('a','z'));
}
if ($default_code_type==2){
$characters = array_merge(range('A','Z'), range('0','9'));
}
if ($default_code_type==3){
$characters = array_merge(range('a','z'), range('0','9'));
}
if ($default_code_type==4){
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
}
//print_r($characters);
$count_characters = count($characters);
$count_range = pow($count_characters, $default_code_length);
 
$query = $mysqli->query("SELECT count(*) AS code_result FROM `code_generator`;");
$result = $query->fetch_assoc();
//echo $result['code_result'];
if ($count_range>$result['code_result']){
  $existuje = 1;
 
  while ($existuje>0) {
    $code_base ='';
 
for ($i = 0; $i < $default_code_length; $i++) {
    $code_base .= $characters[mt_rand(0, $count_characters-1)];
}
 
 
$myqsli_results = $mysqli->query("SELECT * FROM `code_generator` WHERE `code_generated` = '".$code_base."';");
$existuje = $myqsli_results->num_rows;
}
 
return array('code_base'=>$code_base,'code_time'=>time(),'code_range'=>$count_range,'code_result'=>$result['code_result']);
 
}else{
return array('code_time'=>time(),'code_range'=>$count_range,'code_result'=>$result['code_result']);
 
}
 
}

//Pouziti
$code = generate_code($mysqli);
//print_r($code);

if($code['code_range']>$code['code_result']){
$code_base = $code['code_base'];
$mysqli_query = "INSERT INTO code_generator (code_id, code_generated) VALUES (NULL, '$code_base');";
$mysqli_results = $mysqli->query($mysqli_query);

if ($mysqli_results){
    echo "New record created successfully";  
}else{
    echo " Error: " . $mysqli_query . "<br>" . $mysqli->error;
}

}else{
echo 'Error time : '.date('d.m.Y H:i:s', $code['code_time']). '<br />Error : The generation of the code is disallowed because the database is now completely full!';
}

Nevite napriklad jak se da kod generovat postupne misto nahodne jde o to ze kdyz se vyhledeva kod ktery neexistuje tak to muze nejakou dobu trvat obzvlast kdyz nastaveni bude velke viz priklad : $default_code_length=8,$default_code_type=4

Predem diky za radu.


Jeste jsem zjistil dalsi problem:
Pri generovani kodu s nastavenim $default_code_length=1,$default_code_type=4
se nemuze vlozit napriklad pismenko male "z" protoze uz existuje velke pismeno "Z" nevite jak to osetrit tak abych mohl vlkladat male i velke pismenka taky mam nekdy problem s kodem ktery obsahuje cislo nula nazacatku.
juriad
Profil
Silver8000:
Lepší je mít v databázi sloupec code_generated s omezením UNIQUE. A nezkoušet SELECTem, zda existuje, ale rovnou provést INSERT. Pokud ten selže (to poznáš podle čísla chyby), tak zkusíš vygenerovat jiný kód a to opakuješ.
Toto, co jsi vytvořil totiž nefunguje spolehlivě. Představ si, že budou probíhat dva dotazy zároveň (pro dva uživatele). Oba dva náhodou vygenerují stejný kód a oba zjistí, že v databázi ještě není. A pak se jej oba budou snažit vložit do databáze. Oops.

Ta ochrana pomocí range je ti stejně k ničemu, protože při osmimístném kódu, když bude poslední volný, tak se ti ho povede trefit na 2821109907456-tý pokus. To je jeden měsíc času při rychlosti milion dotazů za sekundu. Když bude zbývat 50000 kódů, tak generování jednoho bude trvat průměrně minutu. Toho už si všimneš - aplikace bude opravdu pomalá. Mnohem lepší je tedy zkusit vygenerovat kód třeba 10x a předpokládat, že ta funkce nemusí vrátit nic. Při zaplněnosti databáze 1/10 všech kódů (tedy 282110990745) bude pravděpodobnost, že se ti nepovede ani na desátý pokus trefit neexistující kód 0.0000000001.

Samozřejmě, že pravděpodobnosti budou úplně jinde, pokud budeš používat méně znaků než 8.

Ukázka (netestováno):

function generate_code($connection, $length = 8, $type = 'A0') {
    $classes = array('a' => range('a', 'z'), 'A' => range('A', 'Z'), '0' => range('0', '9'));
    $characters = array();
    for (str_split($type) as c) {
        if (isset($classes[$c])) {
            $characters = array_merge($characters, $classes[$c]);
        }       
    }   

    for ($try = 0; $try < 10; $try++) {
        $code = '';
        for ($i = 0; $i < $length; $i++) { 
            $code .= $characters[array_rand($characters)];
        }       

        $query = "INSERT INTO code_generator (code_generated) VALUES ('" . $connection->real_escape_string($code) . "')";
        $result = $connection->query($query);
        if ($result) {
            return array('code_id' => $connection->insert_id, 'code_generated' => $code); # if successful
        } else if ($connection->connect_errno != 1062) {
            return FALSE; # if other error than duplicate
        }       
    }   
    return NULL; # too many tries
}
Silver8000
Profil
No ale to zatim neresi moji otazku :

Silver8000:
Nevite napriklad jak se da kod generovat postupne misto nahodne jde o to ze kdyz se vyhledeva kod ktery neexistuje tak to muze nejakou dobu trvat obzvlast kdyz nastaveni bude velke viz priklad : $default_code_length=8,$default_code_type=4

Mezi tim jsem nasel nejakou funkci ktera generuje kod postupne : https://github.com/admiyn/sequential-alphanumeric-generator/blob/master/alphanumeric-generator.php

Funkce :
<?php
function anderson_makiyama_get_next_alphanumeric($code){
//Media User Code Generator -> MUCG function

    //https://github.com/admiyn/sequential-alphanumeric-generator

    $chars = str_split("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
    
    $code_array = str_split($code);
    
    // Starts searching for the next character capable of increasing, or different from Z
    // Note that initiates the last character to the first
    for($i = count($code_array)-1;$i>-1;$i--){
        
        if($code_array[$i] == "Z"){
        
            if($i==0){
                //Se for igual a Z e for o primeiro caractere, entĂŁo aumenta o comprimento e zera
                
                $code_array = array_fill(0,count($code_array) + 1,0);
                
                return implode("",$code_array);
            
            }else{
                
                
                if($code_array[$i -1] != 'Z'){
                    // If the character is different from previous Z, increment it and resets the current and subsequent
                    // If the character is above the first, also works because it increases and the other resets
                    
                    $code_array[$i -1] = $chars[array_search($code_array[$i -1],$chars) + 1];
                    
                    for($j = $i; $j < count($code_array); $j++){
                    
                        $code_array[$j] = 0;
                        
                    }
                    
                    return implode("",$code_array);
                    
                }
                
            }
        
        }else{
                // calculate the next character, or increments the current
                
                $code_array[$i] = $chars[array_search($code_array[$i],$chars) + 1];

                if($i == 0){
                    //Se for o primeiro caractere, significa que os demais sĂŁo z
                    //Ou seja, zera eles
                    
                    $novo_array = array_fill(0,count($code_array),0);
                    
                    $novo_array[0] = $code_array[$i];
                    
                    $code_array = $novo_array;
                
                }
                
                return implode("",$code_array);
            
        }
        
    }

}

?>
a nevim jak to mam prispusobit me funkci...muzete prosim nekdo pomoct aby moje funkce generovala kod postupne misto nahodne...cili tu funkci na kterou jsem zkopiroval z odkazu aby byla prispusobena.
Tak alespon zabranim prohledavani cele databaze a snizim prodlevu pri generovani kodu.

Predem vam dekuji.
juriad
Profil
Silver8000:
Tato funkce prakticky funguje v dvaašedesátkové soustavě. Přizpůsobení tvým podmínkám může být stejně nebo více náročné než ji napsat odznova.

O co ti vlastně jde?
- Chceš náhodný kód, nebo náhodně vypadající?
- Smí z toho kódu být odvoditelný předchozí a následující, případně smí být převoditelný na číslo? Toto může být zneužito na některé typy útoků.
- Smí být dva kódy porovnatelné (ve významu, jeden byl vytvořen dříve než druhý)?
- Potřebuješ pevnou délku, nebo se může postupně prodlužovat? Má se délka řešit za pomocí padingu?
- Potřebuješ parametrický způsob nastavení báze?
- Jak moc to má být odolné proti duplicitám?
- Jsi ochotný použít existující PHP funkci na úkor některých požadavků?

Těch otázek je docela dost. Různé nároky vyžadují různé přístupy.
Silver8000
Profil
No tak uz jsem to vyresil celkove a tady je ta funkce :
<?php
function generate_code($default_code=false,$default_code_length=1,$default_code_type=1,$demo_code=true){
//Media User Code Generator -> MUCG function
 
$code_time = time();
if ($default_code_type==1){
$characters = array_merge(range('A','Z'), range('a','z'));
$code_name = '[A-Z,a-z]';
$code_number = 1;
}
if ($default_code_type==2){
//Megaupload.com style
$characters = array_merge(range('A','Z'), range('0','9'));
$code_name = '[A-Z,0-9]';
$code_number = 2;
}
if ($default_code_type==3){
$characters = array_merge(range('a','z'), range('0','9'));
$code_name = '[a-z,0-9]';
$code_number = 3;
}
if ($default_code_type==4){
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
$code_name = '[A-Z,a-z,0-9]';
$code_number = 4;
}
if ($default_code_type==5){
//Youtube.com style
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_'));
$code_name = '[A-Z,a-z,0-9,-_]';
$code_number = 5;
}
//print_r($characters);
$count_characters = count($characters);
$count_range = pow($count_characters, $default_code_length);
$character_end = 'Z';
$character_start = '';
    //https://github.com/admiyn/sequential-alphanumeric-generator
 if ($default_code==false){

for ($n=1;$default_code_length>=$n;$n++){
if ($demo_code){
$character_start .= $characters[rand(0,($count_characters-1))];//'A';
}else{
$character_start .= 'A';//$characters[rand(0,2)];
}

}

$code_base = $character_start;
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{

    $chars = $characters;
    
    $code_array = str_split($default_code);
    
    // Starts searching for the next character capable of increasing, or different from Z
    // Note that initiates the last character to the first
    for($i = count($code_array)-1;$i>-1;$i--){
        
        if($code_array[$i] == $character_end){
        
            if($i==0){
                //Se for igual a Z e for o primeiro caractere, entĂŁo aumenta o comprimento e zera
                
                $code_array = array_fill(0,count($code_array) + 1,0);

$code_base = implode("",$code_array);
if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}

            
            }else{
                
                
                if($code_array[$i -1] != $character_end){
                    // If the character is different from previous Z, increment it and resets the current and subsequent
                    // If the character is above the first, also works because it increases and the other resets
                    
                    $code_array[$i -1] = $chars[array_search($code_array[$i -1],$chars) + 1];
                    
                    for($j = $i; $j < count($code_array); $j++){
                    
                        $code_array[$j] = 0;
                        
                    }
$code_base = implode("",$code_array);
if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}
                }
                
            }
        
        }else{
                // calculate the next character, or increments the current
                
                $code_array[$i] = $chars[array_search($code_array[$i],$chars) + 1];
 
                if($i == 0){
                    //Se for o primeiro caractere, significa que os demais sĂŁo z
                    //Ou seja, zera eles
                    
                    $novo_array = array_fill(0,count($code_array),0);
                    
                    $novo_array[0] = $code_array[$i];
                    
                    $code_array = $novo_array;
                
                }
$code_base = implode("",$code_array);
if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}
        }
        
    }

}

 
}
print_r(generate_code($code_inserted=false,$default_code_length=3,$default_code_type=5,$demo_code=false));
?>
Ukazka vypisu :
Array ( [code_base] => AAA [code_range] => 262144 [code_time] => 1415235352 [code_message] => [code_name] => [A-Z,a-z,0-9,-_] [code_number] => 5 [code_length] => 3 ) 



Puvodne jsem zamyslel mit nahodne generovany kod ale pak jsem zjisitl ze vygenerovani kodu muze nekdy zabrat delsi dobu a rozhodl jsem se ze radeji budu mit nahodne vypadajici kod protoze aspon nebudu vytezovat server MySql kvuli prohledavani jestly vygenerovany kod je uz v databazi a budu mit tak kodovani pod kontrolou.Ted misto prohledavani staci zjistit jaky byl kod posledni a od toho se vypocita dalsi novy ktery v databazi neni.
Zkombinoval jsem svuj kod s tim kodem z odkazu.
Myslim ze funkce obsahuje vsechny potrebne informace.
Funkce obsahuje muj kod ktery je zapnut pouze v demo pro ukazku.To bude dobre hlavne v Administraci nejake aplikace,protoze admin pak muze jednoduse zvolit nastaveni.
Dale kdyz dam pismenka AAA tak mi z toho vyleze AAB cili je to nahodne vypadajici kod generovany postupne.
Je tam take omezeni proti zvetsovani ci nespravnosti kodu a zobrazeni chybove hlasky : 'code_message'=>'is_upper_or_full' nebo 'code_message'=>'is_lower' a pokud kod ma zpravny pocet pismenek nebo cisel tak uzivatel teto funkce nedostane zadnou hlasku : 'code_message' => .
Pouziti je az extra jednoduche :
//Vygeneruje nahodny kod
print_r(generate_code());
//Megavideo.com style
print_r(generate_code(false,$default_code_length=8,$default_code_type=2));
//Youtube.com style
print_r(generate_code(false,$default_code_length=11,$default_code_type=5));

//Vygenerovani privniho klice

//Megavideo.com style
print_r(generate_code(false,$default_code_length=8,$default_code_type=2,false));
//Youtube.com style
print_r(generate_code(false,$default_code_length=11,$default_code_type=5,false));

//Vygenerovani nasledujiciho klice

//Megavideo.com style
print_r(generate_code('AAAAAAAA',$default_code_length=8,$default_code_type=2,false));
//Youtube.com style
print_r(generate_code('AAAAAAAAAAA',$default_code_length=11,$default_code_type=5,false));
Mozna ten kod je trochu necistej ale fukcnost je momentalne hlavni vec....pokud by nekdo vedel jak kod zjednodusit a zaroven zachovat funkcnost tak bych byl moc rad.
Silver8000
Profil
Jeste by me zajimalo jak se da vypocitat poradi kodu napriklad kdyz budu mit nastaveno $default_code_length=8 coz znamena ze AAAAAAAA je prvni generovany kod a AAAAAAAB je druhy vygenerovany kod.
Nevite jak se to da vypocitat?
Predem diky za rady.
juriad
Profil
Silver8000:
Kdyby to byly číslice místo písmen, tak bys to zvládnul?
0000 0000 = kód číslo 0
0000 0001 = kód číslo 1
0000 0158 = kód číslo 1 * 10^2 + 5 * 10^1 + 8 * 10^0 = 158

Pro písmena (A=0, B=1, C= 2, ... Z = 25, a = 26, ..., z = 51, 0 = 52, 1 = 53, 9 = 61:
AAAA ABCD = kód číslo 0 * 62^7 + 0 * 62^6 + 0 * 62^5 + 0 + 62^4 + 0 * 62^3 + 1 * 62^2 + 2 * 62^1 + 3 * 62^0 = 14780307

Obecně: kód znaku je jeho pořadí v poli $characters; základ je $count_characters a exponent je sestupný (tak aby poslední znak měl exponent 0).
Silver8000
Profil
Podarilo se mi to rozchodit,obratil jsem hodnoty na klice : array_flip() a nechal jsem udelat z generovaneho klice tabulku array(),kterou nasledne prohledavam hodnoty znaku v tabulce $characters.
Kousek kodu :
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
//print_r($array_search);
$code_current_number = '';
foreach ($array_search as $array_value){
$code_current_number .= $array_chars[$array_value];
}
echo $code_current_number+1;
Jen nevim jak mam zajistit aby se to jeste mezi sebou scitalo,nasobilo atp. abych dostal zpravne cislo.
Silver8000
Profil
Mam to takhle spravne ?
je to dynamicke pocitadlo ktere vypocita kolik nul bude potreba vygenerovat pro kazdy klic a pak secte celkovy vysledek.
<?php
$default_code_length=8;
$characters = array_merge(range('A','Z'), range('0','9'));
$array_chars = array_flip($characters);
$array_search = str_split('ZABAAAAB');
//print_r($array_chars);
//print_r($array_search);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
//print_r($code_count_number);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
//echo $array_chars[$array_value] * '1'.$code_count_zeros;//.'<br>';
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}
echo $code_current_number;
?>



Predpokladam ze dynamicke pocitadlo pocita spravne a tudis jsem dokoncil celou funkci.
Funkce generate_code():
function generate_code($default_code=false,$default_code_length=1,$default_code_type=1,$demo_code=true){
//Media User Code Generator -> MUCG function
 
$code_time = time();
if ($default_code_type==1){
$characters = array_merge(range('A','Z'), range('a','z'));
$code_name = '[A-Z,a-z]';
$code_number = 1;
}
if ($default_code_type==2){
//Megaupload.com style
$characters = array_merge(range('A','Z'), range('0','9'));
$code_name = '[A-Z,0-9]';
$code_number = 2;
}
if ($default_code_type==3){
$characters = array_merge(range('a','z'), range('0','9'));
$code_name = '[a-z,0-9]';
$code_number = 3;
}
if ($default_code_type==4){
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
$code_name = '[A-Z,a-z,0-9]';
$code_number = 4;
}
if ($default_code_type==5){
//Youtube.com style
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_'));
$code_name = '[A-Z,a-z,0-9,-_]';
$code_number = 5;
}
//print_r($characters);
$count_characters = count($characters);
$count_range = pow($count_characters, $default_code_length);
$character_end = 'Z';
$character_start = '';
    //https://github.com/admiyn/sequential-alphanumeric-generator
 if ($default_code==false){

for ($n=1;$default_code_length>=$n;$n++){
if ($demo_code){
$character_start .= $characters[rand(0,($count_characters-1))];//'A';
}else{
$character_start .= 'A';//$characters[rand(0,2)];
}

}

$code_base = $character_start;
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
//print_r($array_search);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
//print_r($code_count_number);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
//echo $array_chars[$array_value] * '1'.$code_count_zeros;//.'<br>';
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{

    $chars = $characters;
    
    $code_array = str_split($default_code);
    
    // Starts searching for the next character capable of increasing, or different from Z
    // Note that initiates the last character to the first
    for($i = count($code_array)-1;$i>-1;$i--){
        
        if($code_array[$i] == $character_end){
        
            if($i=='0'){
                //Se for igual a Z e for o primeiro caractere, entĂŁo aumenta o comprimento e zera
                
                $code_array = array_fill(0,count($code_array) + 1,0);

$code_base = implode("",$code_array);
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
//print_r($array_search);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
//print_r($code_count_number);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
//echo $array_chars[$array_value] * '1'.$code_count_zeros;//.'<br>';
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}

if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}

            
            }else{
                
                
                if($code_array[$i -1] != $character_end){
                    // If the character is different from previous Z, increment it and resets the current and subsequent
                    // If the character is above the first, also works because it increases and the other resets
                    
                    $code_array[$i -1] = $chars[array_search($code_array[$i -1],$chars) + 1];
                    
                    for($j = $i; $j < count($code_array); $j++){
                    
                        $code_array[$j] = '0';
                        
                    }
$code_base = implode("",$code_array);
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
//print_r($array_search);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
//print_r($code_count_number);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
//echo $array_chars[$array_value] * '1'.$code_count_zeros;//.'<br>';
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}

if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}
                }
                
            }
        
        }else{
                // calculate the next character, or increments the current
                
                $code_array[$i] = $chars[array_search($code_array[$i],$chars) + 1];
 
                if($i == '0'){
                    //Se for o primeiro caractere, significa que os demais sĂŁo z
                    //Ou seja, zera eles
                    
                    $novo_array = array_fill(0,count($code_array),0);
                    
                    $novo_array[0] = $code_array[$i];
                    
                    $code_array = $novo_array;
                
                }
$code_base = implode("",$code_array);
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
//print_r($array_search);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
//print_r($code_count_number);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
//echo $array_chars[$array_value] * '1'.$code_count_zeros;//.'<br>';
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}

if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}
        }
        
    }

}

 
}

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;

print_r(generate_code(false,$default_code_length=8,$default_code_type=2));
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';
Silver8000
Profil
Mensi uprava funkce -> Prejmenoval jsem to na "unique_key_generator()" a pridal jsem standartni hashing MD5(),SHA1(),base64_encode().
Vyhoda funkce je ze i kdyz generuje nahodny kod vy stale budete vedet kolikaty je, napriklad 1 nebo 289 atp.
Ted uz jsi nemusim lamat s vyhledavanim generovaneho kodu jelikoz se sam vypocita a ja vim jestly v databazi existuje.
Funkce "unique_key_generator()":


<?php
function unique_key_generator($default_code_length=1,$default_code_type=1,$default_code=false,$demo_code=true){
$code_time = time();
if ($default_code_type==1){
$characters = array_merge(range('A','Z'), range('a','z'));
$code_name = '[A-Z,a-z]';
$code_number = 1;
}
if ($default_code_type==2){
//Megaupload.com style
$characters = array_merge(range('A','Z'), range('0','9'));
$code_name = '[A-Z,0-9]';
$code_number = 2;
}
if ($default_code_type==3){
$characters = array_merge(range('a','z'), range('0','9'));
$code_name = '[a-z,0-9]';
$code_number = 3;
}
if ($default_code_type==4){
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
$code_name = '[A-Z,a-z,0-9]';
$code_number = 4;
}
if ($default_code_type==5){
//Youtube.com style
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_'));
$code_name = '[A-Z,a-z,0-9,-_]';
$code_number = 5;
}
//print_r($characters);
$count_characters = count($characters);
$count_range = pow($count_characters, $default_code_length);
$character_end = 'Z';
$character_start = '';
//https://github.com/admiyn/sequential-alphanumeric-generator
if ($default_code==false){
for ($n=1;$default_code_length>=$n;$n++){
if ($demo_code){
$character_start .= $characters[rand(0,($count_characters-1))];//'A';
}else{
$character_start .= 'A';//$characters[rand(0,2)];
}
}
$code_base = $character_start;
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
    $chars = $characters;
    $code_array = str_split($default_code);
    for($i = count($code_array)-1;$i>-1;$i--){
        if($code_array[$i] == $character_end){
            if($i=='0'){
                $code_array = array_fill(0,count($code_array) + 1,0);
$code_base = implode("",$code_array);
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}
if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}
            }else{
                if($code_array[$i -1] != $character_end){
                    $code_array[$i -1] = $chars[array_search($code_array[$i -1],$chars) + 1];
                    for($j = $i; $j < count($code_array); $j++){
                        $code_array[$j] = '0';
                    }
$code_base = implode("",$code_array);
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}

if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}
                }
               
            }
       
        }else{
                $code_array[$i] = $chars[array_search($code_array[$i],$chars) + 1];
                if($i == '0'){
                    $novo_array = array_fill(0,count($code_array),0);
                    $novo_array[0] = $code_array[$i];
                    $code_array = $novo_array;
                }
$code_base = implode("",$code_array);
$array_chars = array_flip($characters);
$array_search = str_split($code_base);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}

if ($default_code_length==strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}else{
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>($code_current_number+1),'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_number'=>$code_number,'code_length'=>$default_code_length);
}
        }
       
    }

}

 
}
?>



Pouziti funkce :
<?php

$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;

//print_r(unique_key_generator($default_code_length=8,$default_code_type=2,$code_inserted=false));
/*
//Vygeneruje nahodny kod
print_r(unique_key_generator());
//Megavideo.com style
print_r(unique_key_generator($default_code_length=8,$default_code_type=2,$code_inserted=false));
//Youtube.com style
print_r(unique_key_generator($default_code_length=11,$default_code_type=5,$code_inserted=false));
 
//Vygenerovani privniho klice
 
//Megavideo.com style
print_r(unique_key_generator($default_code_length=8,$default_code_type=2,$code_inserted=false,$code_random=false));
//Youtube.com style
print_r(unique_key_generator($default_code_length=11,$default_code_type=5,$code_inserted=false,$code_random=false));
 
//Vygenerovani nasledujiciho klice
 
//Megavideo.com style
print_r(unique_key_generator($default_code_length=8,$default_code_type=2,'AAAAAAAA',$code_random=false));
//Youtube.com style
print_r(unique_key_generator($default_code_length=11,$default_code_type=5,'AAAAAAAAAAA',$code_random=false));
*/
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';
?>
A vice bych do te funkce ani nedaval protoze uz ma vse potrebne ... funkce se ted da pouzit do jakekoliv aplikace at na generovani hesla nebo odkazu na nejakou stranku ci kdyz zajdu daleko tak i nejaky prolamovaci system.
mimochodec
Profil
Silver8000:
A tak jako mezi námi: tobě se ta funkce líbí? Vyznáš se v ní? Ten třikrát opakovaný skoro stejný blok kódu, to je taky ok?
Co je mmch. tohle?

for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;

Ty máš v $code_count_number číslo, ze kterého tvoříš nějaký desítkový řád něčeho? Jestli myslíš, že takhle vypadá slušné programování, tak v žádném případě. A rozhodně nemluvím jen o tomhle řádku.
Silver8000
Profil
To je pocitadlo ktery vypocita kolik nul ma dat pro kazde pismeno ci cislo pak se to mezi s sebou vynasobi a secte.viz:#14
Ja jsem se ptal jak kod zjednodusit nikdo nic nepsal.
I kdyz je funkce velka tak i presto jede celkem rychle.
Ja se v te funkci vyznam.
Chapu ze ten kod je mozna napsanej hnusne ale mam omezene znalosti a snazim se vytvaret podle toho jak umim.


Co se tice toho pocitadla jeste jak uz tu nekdo rikal napriklad 00000000 = kod cislo 1
a ja jsem nechal z toho udelat tabulku array ze ktery to zase ctu spusobem ze se vypocita na kterem miste je kazdy znak podle toho se mu pridaji nuly plus pred nuly musi byt jednicka a nechal jsem to vynasobit cislem ktere pripadlo prave na nalezeny znak v $array_chars a pak secist.


Pokud nekdo vi jak kod zjednodusit tak at ho prepise protoze ja si nejak neumim predstavit ze by ten kod vypadal jinak nez je.
mimochodec
Profil
Kdyz ti v tehle diskusi nikdo neporadi, znamena to vetsinou, ze nikdo nechape, co vlastne chces. Nerad bych se pletl, ale myslim si, ze toto je ten pripad. Na konkretni veci jsi rady dostal, ale podstata tveho dotazu mi unika, takze k tomu jsem aspon ja poradit nemohl.
Chces generovat nahodny retezec, kteremu budes zadavat delku a nejake sady znaku, je to tak? Neni nejmensi duvod pracovat s tim retezcem jako s cislem (nasobit nebo dokonce umocnovat). Proc nevyhovuje to, co jsem psal ve #4?
Silver8000
Profil
Moje hlavni myslenka byla o tom jak udelat unikatni generator ktery generuje klice a vypocita kolik moznosti klicu muze poskytnout a zaroven aby vypocital poradi jednotliveho klice z celku ktere se lisi podle nastaveni generatoru.
Samozhrejme je jiz tento Unikatni generator klicu zhotoven a je pripraven na intergraci do aplikace kterou si sam uzivatel zvoli a je jen na nem jakym spusobem ji vyuzije.
Musim take podekovat za cast kodu od toho typka ktery udelal tu tezsi cast : https://github.com/admiyn/sequential-alphanumeric-generator
Napojeni na MySql je snadnejsi nez prvni verze generatoru s temi tabulky.
Ted staci aby v MySql uzivatel zjistil posledni zadany klic a ten pak vlozil do generatoru aby mu vygeneroval nasledujici,dale vytvoreni Insertu pri vytvareni noveho klice a prirazeni klice k tabulce(DB,table,ID,KEY,atp.).
Pak uz uzivatel pracuje jen s databazi a dalsimy skripty.
mimochodec
Profil
ok, tak já se asi smířím s tím, že tomu nerozumím.
Kdykoliv jsem já potřeboval generovat náhodný řetězec, vystačil jsem si s tím, že jsem si odhadl, kolik unikátních řetězců budu potřebovat, vynásobil cca 10-20x, spočítal potřebný počet míst a použil ten cca 15řádkový kód. Nevím, k čemu ti je informace o posledním zadaném klíči nebo jeho pořadí. Je to ale tvůj kód, tak už ti do toho mluvit nebudu.
Silver8000
Profil
Jasne ze kazdy ma svuj vlastni zpusob generovani ale jeste jsem nevidel nikde unikatni generator klicu ktery muzete pouzit kdekoliv a na cokoliv.
S prikazem print_r() dostanete tabulku ve ktere jsou vsechny potrebne informace se kteryma pak aplikace pracuje a pritom kazda z techo informaci je unikatni.
Array ( [code_base] => DLRK6B14 [code_base_md5] => 5a3e4586e49ed5e86d2737fee7dac5a8 [code_base_sha1] => 3a0f661ee45ccf1882558b1817194582a7c06a2e [code_base64_encode] => RExSSzZCMTQ= [code_range] => 2821109907456 [code_count] => 42832401 [code_time] => 1415343664 [code_message] => [code_name] => [A-Z,0-9] [code_type] => 2 [code_length] => 8 )
to co delas ty slozite ja mam obsahle v tom generatoru a navic ja jsem nenechal udelat odhat ale primi vypocet.
Celou operaci generovani jsem zjednodusil,takze na misto sloziteho vypisovani se pouzije jednoduse tato funkce "unique_key_generator()" a je to.
Pak uz zalezi jen jake nastaveni zvolite.


Myslim ze az konecne nekdo obevi jak tento klic funguje tak bude prekvapen hlavne jeho funkcemi protoze muze generovat klic jakekoliv velikosti a tvaru,take samozhrejme muze slouzit k otevreni ci prolomeni vstupniho kodu nejake aplikace.
juriad
Profil
Ta funkce je prostě od základu špatně. Vygeneruje následující řetězec na základě pravidel iterace znaků ve třídě. Vůbec nemusí být unikátní, unikátnost se nikde neřeší. Kdo garantuje, že v okamžiku vložení do databáze bude tento kód volný?

Ta funkce navíc provádí hromadu zbytečných věcí - proč počítá base64, md5 a sha1? Proč neprovádí třeba vyhledání na Googlu, zda už někdo někdy takový kód použil, to by jistě mohla být zajímavá informace. Koho zajímá jak dlouho trval výpočet? Proč vrací v poli své argumenty?

Proč jsou typy kódů zadávané jako číselný literál bez jakékoli souvislosti se třídami znaků?
Hurá pro 8znakový kód typu 2 existuje 2821109907456 možností, myslíš, že se někdy přiblížíš k jejich vyčerpání? Ne; proč takovou informaci vůbec počítáš. Obdobně, koho zajímá textová informace o vztahu délky vygenerovaného kódu a požadované délky? Kohokoli to zajímá, tak si kontrolu pomocí strlen provede sám, nebude podmínkovat ten tvůj string.

A ta nejpodstatnější chyba; nepochopil jsi, že pro získání kódu musíš za základ považovat počet znaků ve třídě nikoli 10. Takže ta tvoje prasárna se slepováním nul nefunguje. Schválně si zkus porovnat čísla kódů AZ a BA. (Nezkoušel jsem to, ale myslím, že to bude opačně než chceš).

A ten závěr je opravdu skvělý:
„Myslim ze az konecne nekdo obevi jak tento klic funguje tak bude prekvapen hlavne jeho funkcemi protoze muze generovat klic jakekoliv velikosti a tvaru,take samozhrejme muze slouzit k otevreni ci prolomeni vstupniho kodu nejake aplikace.“
Ano, bude překvapen, protože každý po té funkci bude chtít jen vygenerovat unikátní kód, ne znát odpověd na otázku života, vesmíru a vůbec.
Jakýkoli tvar, ehm, jen 5 možných tvarů bez možnosti jejich úpravy; co když chci kód složený ze tří trojmístných úseků složených z malých písmen oddělených pomlčkou? Ups.
Sloužit k prolomení? Za jak dlouho to vygeneruje všechny čtyřmístné kódy? Zkusil jsi si udělat nějaký test?

Asi si stále myslíš, že vytvořit funkci, která umí úplně vše je skvělé. Není. Lepší je mít kolekci funkcí, kde každá z nich je zodpovědná jen za jednu jedinou věc. Každá z těch funkcí bude malá přehledná a hlavně se bude chovat tak, jak uživatel očekává.
tiso
Profil
print_r(unique_key_generator(1, 6));//5 x notice, 1 x warning
Silver8000
Profil
Jasne ze 1,6 ti fungovat nebude protoze tam je jenom 5 moznosti.


juriad:
co když chci kód složený ze tří trojmístných úseků složených z malých písmen oddělených pomlčkou? Ups
tak jednoduse vygenerujes klic o potrebne velikosti a nechas za kazdym 3. znakem krome posledniho pridat pomlcku.


tiso:
print_r(unique_key_generator(1, 6));//5 x notice, 1 x warning
ve funkci si zmen tohle :
if ($default_code_type==5){
//Youtube.com style
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_'));
$code_name = '[A-Z,a-z,0-9,-_]';
$code_number = 5;
}
na tohle :
if ($default_code_type>4){
//Youtube.com style
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_'));
$code_name = '[A-Z,a-z,0-9,-_]';
$code_number = 5;
}



dik za pripominku.


Samozhrejme pokud tam chces vice moznosti musis si je tam pridat.
tiso
Profil
Silver8000: „Jasne ze 1,6 ti fungovat nebude
To ja viem, len som ťa upozornil na ďalšiu chybu.
Silver8000
Profil
Zrejme me tu spousta lidi nechape,vim ze jmeno tohoto prizpevku nesouhlasi s tim co jsem vytvoril ale to byl zacatek toho co jsem resil a vyresil jsem to

juriad:
Ta funkce navíc provádí hromadu zbytečných věcí - proč počítá base64, md5 a sha1?
Protoze si treba nekdo usmysli ze generator pouzije na generovani hesel a tak nebude muset znova pouzit hashing protoze uz je to vypocitane.

Koho zajímá jak dlouho trval výpočet?
Generator nepocita jaky cas potreboval k vygenerovani klice.
Generator obsahuje pouze informaci kdy byl kod vygenerovan a tento cas pak muzes prevest na hodiny,minuty,sekundy,dny,mesic a rok.
Muze to byt zaznam o tom kdy treba byl prislusny prizpevek vytvoren.
Pozdeji s tim jde pracovat i tak ze se muze vypocitat kolik casu ubehlo od zalozeni.

Takže ta tvoje prasárna se slepováním nul nefunguje
<?php
$default_code_length=8;
$characters = array_merge(range('A','Z'), range('0','9'));
$array_chars = array_flip($characters);
$array_search = str_split('ZABAAAAB');
//print_r($array_chars);
//print_r($array_search);
$code_current_number = '';
foreach ($array_search as $array_key=>$array_value){
$code_count_number = $default_code_length-($array_key+1);
//print_r($code_count_number);
$code_count_zeros = '';
for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
$code_count_zeros .= '0';
}
//echo $array_chars[$array_value] * '1'.$code_count_zeros;//.'<br>';
$code_current_number += $array_chars[$array_value] * '1'.$code_count_zeros;
}
echo $code_current_number;
?>
Nefunguje? Tak mi porad jak to udelat lepe pripadne to prosim vyres protoze me napadl pouze tento spusob.
Ja si jinak myslim ze funguje az moc dobre.
Zkus si to na testovacim kodu ktery mas tady shora ale musis dodrzet pravidla kodu napriklad kdyz mas $default_code_length=8; tak pocet znaku musi byt take 8 $array_search = str_split('ZABAAAAB');.


Uz jsem to opravil ted funguje zpravne :
//Pocitadlo_start
            $array_search = str_split($code_base);
                $code_current_number = '';
                foreach ($array_search as $array_key=>$array_value){
                $code_count_number = $default_code_length-($array_key+1);

                    $code_count_zeros = '';
                    for ($ccn=1;$code_count_number>=$ccn ;$ccn++){
                    $code_count_zeros .= '0';
                    }
                $code_current_number += ($array_chars[$array_value]+1) * '1'.$code_count_zeros;
                }
//Pocitadlo_end
Alphard
Profil
Silver8000:
Zrejme me tu spousta lidi nechape,vim ze jmeno tohoto prizpevku nesouhlasi s tim co jsem vytvoril ale to byl zacatek toho co jsem resil
Toto vlákno jsem začal sledovat pozdě a délka prvních příspěvků mě odrazuje od jejich čtení. Když zformulujete nový název vlákna, přejmenuji ho. Pokud stručně shrnete, co má ta šílená funkce dělat, možná se zorientuje i někdo další.
juriad
Profil
Silver8000:
Také jsem si kdysi myslel, že hash slouží k „zabezpečení“ hesla. Není tomu tak, hash slouží k rychlému pravděpodobnostnímu testu shody. U hesel nechceš používat rychle funkce md5 (které už je prolomené http://www.linuxexpres.cz/novinky/na-uspesny-utok-proti-md5-staci-10-hodin-a-65-centu) ani sha1. Chceš používat něco, co lze vypočítat jen pomalu - aby útočník nemohl zkoušet miliony možností za sekundu. Jsou dokonce hashovací funkce, u kterých zadáš počet iterací a můžeš tedy vynutit, aby na běžném počítači trvaly 0.01 sekundy. Pro přihlášení, které se provádí jedinkrát za SESSION je to odůvodnitelné.

Aha, já myslel, že je to doba; podle délky dává smysl, že je to timestamp. Ale ten také není k ničemu dobrý. Když už potřebuješ timestamp, tak ho chceš vygenerovat v okamžiku vytvoření celé entity, nikoli jednoho jejího atributu.

Nefunguje (to co je v [#15]):
print_r(unique_key_generator(2, 1, 'AY', false));
print_r(unique_key_generator(2, 1, 'BA', false));
print_r(unique_key_generator(2, 1, 'BO', false));
Vypíše:
Array
(
    [code_base] => AZ
    [code_base_md5] => 546a9a80eb981c7f0aabcaeb34d9514e
    [code_base_sha1] => 0c9d125b39f8a674cee51c774d4f144fc452ab31
    [code_base64_encode] => QVo=
    [code_range] => 2704
    [code_count] => 26
    [code_time] => 1415407664
    [code_message] => 
    [code_name] => [A-Z,a-z]
    [code_number] => 1
    [code_length] => 2
)
Array
(
    [code_base] => BB
    [code_base_md5] => 9d3d9048db16a7eee539e93e3618cbe7
    [code_base_sha1] => 71c9db717578b9ee49a59e69375c16c0627dffef
    [code_base64_encode] => QkI=
    [code_range] => 2704
    [code_count] => 12
    [code_time] => 1415407664
    [code_message] => 
    [code_name] => [A-Z,a-z]
    [code_number] => 1
    [code_length] => 2
)
Array
(
    [code_base] => BP
    [code_base_md5] => 96d4cdff8ed57e93e3b3d843cffe3af7
    [code_base_sha1] => 03b8a126d8f0c1f381ca5c129acc029d3c436ab0
    [code_base64_encode] => QlA=
    [code_range] => 2704
    [code_count] => 26
    [code_time] => 1415408641
    [code_message] => 
    [code_name] => [A-Z,a-z]
    [code_number] => 1
    [code_length] => 2
)

Ten problém je tam pořád; pořád to násobíš 10, 100, 1000 a nikoli count($characters), count($characters)^2, count($characters)^3.
Ta funkce může vypadat třeba takto:
function number($code) {
        $characters = range('A', 'Z');
        $character_keys = array_flip($characters);

        $code_characters = str_split($code);

        $number = 0;
        for ($i = 0; $i < count($code_characters); $i++) {
                $number = $number * count($characters) + $character_keys[$code_characters[$i]];
        }
        return $number; # pokud chceš tak ještě +1
}

function result($code) {
        echo $code, ': ', number($code), "\n";
}

result('AAA');
result('AAB');
result('AAZ');
result('ABA');
result('ABZ');
result('AZZ');
result('BAA');
Silver8000
Profil
juriad:
Diky za pomoc..
Tady je ta cela funkce:
<?php
function unique_key_generator($default_code_length=1,$default_code_type=1,$default_code=false,$demo_code=true){
$code_time = time();
$code_max_type = 5;
if ($default_code_type==1){
$characters = array_merge(range('A','Z'), range('a','z'));
$code_name = '[A-Z,a-z]';
$code_number = 1;
}
if ($default_code_type==2){
//Megaupload.com style
$characters = array_merge(range('A','Z'), range('0','9'));
$code_name = '[A-Z,0-9]';
$code_number = 2;
}
if ($default_code_type==3){
$characters = array_merge(range('a','z'), range('0','9'));
$code_name = '[a-z,0-9]';
$code_number = 3;
}
if ($default_code_type==4){
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'));
$code_name = '[A-Z,a-z,0-9]';
$code_number = 4;
}
if ($default_code_type>4){
//Youtube.com style
$characters = array_merge(range('A','Z'), range('a','z'), range('0','9'),array('-','_'));
$code_name = '[A-Z,a-z,0-9,-_]';
$code_number = 5;
}
//print_r($characters);
$count_characters = count($characters);
$count_range = pow($count_characters, $default_code_length);
$character_end = 'Z';
$character_start = '';
    //https://github.com/admiyn/sequential-alphanumeric-generator
$array_chars = array_flip($characters);
 if ($default_code==false){

for ($n=1;$default_code_length>=$n;$n++){
if ($demo_code){
$character_start .= $characters[rand(0,($count_characters-1))];
}else{
$character_start .= 'A';
}
}

$code_base = $character_start;
//Pocitadlo_start
        $array_search = str_split($code_base);
 
        $number = 0;
        for ($i = 0; $i < count($array_search); $i++) {
                $code_current_number = $number * count($characters) + $array_chars[$array_search[$i]];
        }
//Pocitadlo_end


                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
}else{

    $chars = $characters;
    
    $code_array = str_split($default_code);
    
    // Starts searching for the next character capable of increasing, or different from Z
    // Note that initiates the last character to the first
    for($i = count($code_array)-1;$i>-1;$i--){
        
        if($code_array[$i] == $character_end){
        
            if($i=='0'){
                //If equal to Z and is the first character, mental increases the length and zeroes
                
                $code_array = array_fill(0,count($code_array) + 1,0);

$code_base = implode("",$code_array);
//Pocitadlo_start
        $array_search = str_split($code_base);
 
        $number = 0;
        for ($i = 0; $i < count($array_search); $i++) {
                $code_current_number = $number * count($characters) + $array_chars[$array_search[$i]];
        }
//Pocitadlo_end

if ($default_code_length==strlen($code_base)){
        return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
                    }elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
                    }else{
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
}

            
            }else{
                
                
                if($code_array[$i -1] != $character_end){
                    // If the character is different from previous Z, increment it and resets the current and subsequent
                    // If the character is above the first, also works because it increases and the other resets
                    
                    $code_array[$i -1] = $chars[array_search($code_array[$i -1],$chars) + 1];
                    
                    for($j = $i; $j < count($code_array); $j++){
                    
                        $code_array[$j] = '0';
                        
                    }
$code_base = implode("",$code_array);
//Pocitadlo_start
        $array_search = str_split($code_base);
 
        $number = 0;
        for ($i = 0; $i < count($array_search); $i++) {
                $code_current_number = $number * count($characters) + $array_chars[$array_search[$i]];
        }
//Pocitadlo_end

if ($default_code_length==strlen($code_base)){
        return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
                    }elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
                    }else{
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
}
                }
                
            }
        
        }else{
                // calculate the next character, or increments the current
                
                $code_array[$i] = $chars[array_search($code_array[$i],$chars) + 1];
 
                if($i == '0'){
                    // If the first character, meaning others Salo z
                     // That is, they reset
                    
                    $novo_array = array_fill(0,count($code_array),0);
                    
                    $novo_array[0] = $code_array[$i];
                    
                    $code_array = $novo_array;
                
                }
$code_base = implode("",$code_array);
//Pocitadlo_start
        $array_search = str_split($code_base);
 
        $number = 0;
        for ($i = 0; $i < count($array_search); $i++) {
                $code_current_number = $number * count($characters) + $array_chars[$array_search[$i]];
        }
//Pocitadlo_end

if ($default_code_length==strlen($code_base)){
        return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
                    }elseif($default_code_length<strlen($code_base)){
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'is_upper_or_full','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
                    }else{
                return array('code_base'=>$code_base,'code_base_md5'=>md5($code_base),'code_base_sha1'=>sha1($code_base),'code_base64_encode'=>base64_encode($code_base),'code_range'=>$count_range,'code_count'=>$code_current_number,'code_time'=>$code_time,'code_message'=>'is_lower','code_name'=>$code_name,'code_type'=>$code_number,'code_max_type'=>$code_max_type,'code_length'=>$default_code_length);
}
        }
        
    }

}

 
}


?>
Silver8000
Profil
Alphard:
Jo a co se tyka toho jmena prizpevku muze se prejmenovat na -> PHP funkce Unique Key Generator.
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0