YouTube random unique code how to (f.e. ntFWXtsojBA)
Gewijzigd op 19/08/2010 11:36:15 door B a s
Waarschijnlijk gewoon een willekeurige waarde genereren
Maar hoe zorgt Youtube ervoor dat de codes uniek zijn?
En om te kijken of de code uniek is maken ze een connectie met de database en controleren of de gegenereerde code al in gebruik is... zo ja? nieuwe code en weer controleren, zo nee .. wegschrijven die hap.
Als je een uniek ID wil genereren gebruik je die methode ;)
uniqid
De 2e parameter zou dan in jouw geval nog fijner zijn
Jonathan de Vries op 17/08/2010 23:39:44:
En om te kijken of de code uniek is maken ze een connectie met de database en controleren of de gegenereerde code al in gebruik is... zo ja? nieuwe code en weer controleren, zo nee .. wegschrijven die hap.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// Tekens opgeven
$tekens = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
// Code aanmaken
while($goed != 1) {
$code = '';
for ($i = 0; $i < rand(6, 10); $i++) {
$code .= $tekens[rand(0, count($tekens) - 1)];
}
if (mysql_num_rows("SELECT id FROM filmpjes WHERE code = '".$code."'") == 0) {
$goed = 1;
}
}
// Klaar, inserten maar :-)
echo $code;
?>
// Tekens opgeven
$tekens = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
// Code aanmaken
while($goed != 1) {
$code = '';
for ($i = 0; $i < rand(6, 10); $i++) {
$code .= $tekens[rand(0, count($tekens) - 1)];
}
if (mysql_num_rows("SELECT id FROM filmpjes WHERE code = '".$code."'") == 0) {
$goed = 1;
}
}
// Klaar, inserten maar :-)
echo $code;
?>
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$sql = mysql_query("SELECT * FROM videos WHERE code='".$code."'");
if (mysql_num_rows($sql) > 0){
//bestaat
}else{
//niet bestaat
}
?>
$sql = mysql_query("SELECT * FROM videos WHERE code='".$code."'");
if (mysql_num_rows($sql) > 0){
//bestaat
}else{
//niet bestaat
}
?>
Gewijzigd op 17/08/2010 23:45:22 door - Raoul -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function rand_code($database, $veld)
{
$tekens = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
while($goed != 1)
{
$code = '';
for ($i = 0; $i < rand(6, 10); $i++) {
$code .= $tekens[rand(0, count($tekens) - 1)];
}
if (mysql_num_rows("SELECT ".$veld." FROM ".$database." WHERE ".$veld." = '".$code."'") == 0) {
$goed = 1;
}
}
return $code;
}
?>
function rand_code($database, $veld)
{
$tekens = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
while($goed != 1)
{
$code = '';
for ($i = 0; $i < rand(6, 10); $i++) {
$code .= $tekens[rand(0, count($tekens) - 1)];
}
if (mysql_num_rows("SELECT ".$veld." FROM ".$database." WHERE ".$veld." = '".$code."'") == 0) {
$goed = 1;
}
}
return $code;
}
?>
Ik win graag een korte code dus vandaar dat MD5 niet bepaald geschikt is.
Jonathan de Vries op 17/08/2010 23:39:44:
En om te kijken of de code uniek is maken ze een connectie met de database en controleren of de gegenereerde code al in gebruik is... zo ja? nieuwe code en weer controleren, zo nee .. wegschrijven die hap.
Dat lijkt me nogal vreemd, als ik dan zo lees , en dat zal al gedateerd zijn dat ze meer als 120.000.000 video's hebben en dat er dagelijks dan circa 200.000 erbij komen
Maar hoe dan ook, 120.000.000 regels afgaan in de database om te zien of die gegenereerde code al niet bestaat.
Ik denk eerder dat ze op basis van de laatste ID een code genereren, en wellicht zit er nog wel meer info in dan behalve op basis van de ID maar als we het alfabet nemen, en dan 26 x de kleine en 26x de groter letters gebruiken kan ik al minstens
een code genereren dat mijn ID al tot 705.835.478.266.880 kan lopen.
Maar dan heb ik wel een ID van iets als v=aBacaDDaeazaXaaRaXaaaaaaBc
Dus ik denk dat je een aanname doet, dan dat het feit is.
Ja ga er ook niet vanuit dat ze het op deze manier doen...
Zou een drama kwa laadtijd worden.
Ik geef meer een oplossing voor de TS, lijkt mij niet dat hij duizenden posts per dag krijgt...
Youtube / Google gebruikt een zelf ontwikkelde MySQL die sneller en veilig is dan die standaard te downloaden is.
Dus die werkt 1000X sneller en veilig dan de normale.
uniqid() heeft microtime preciesie. Iedere microseconde die voorbij gaat zorgt voor een andere, unieke, ID. Dan kan je de more_entropy nog op true zetten om er voor te zorgen dat er op het eind nog een extra willekeurige tekenreeks gezet word.
NO WAY dat dat ooit dubbel KAN zijn. Dan zou er op dezelfde microseconde meerdere aanvragen zijn, die dan toevallig ook nog in dezelfde random tekenreeks terecht komen voor de more_entropy flag..
Beetje kansloos.
uniqid gebruiken?
Dus ik kan beter Het begint met een G, order de lijst alfabetisch an ga kijk naar de eerste, begint dat met een G? Nee, nou 1000 regels verderop dan, Nee, dat is een B, weer 1000 verderop....
de 1000 is hier maar een gok, ik had ergens anders gehoord dat het de lijst steeds door de helft word gedeeld totdat het juiste waarde gevonden is.
@Jarson, het maakt niet uit hoe youtube het doet, we kunnen gokken, misschien maken ze wel een hash van het ID nummer dat altijd 8 tekens lang is, zoals crc32 en crc32b, netzoals MD5 altijd 32 tekens lang zijn, zijn die altijd 8 tekens lang,
Jij wilt een een code genereren die vriendelijk is voor het oog zonder dat je er informatie mee verschaft aan de gebruiker maar nog steeds als sleutel dient voor de db. Bovengenoemde oplossingen werken daarmee prima, uniqid ook, een hash met crc32b ookwel (zou nog steeds die db controle doen, gezien een hash niet perse uniek in)
Wat vind jij het makkelijkte? Wat past het beste bij jouw eisen? Vraag je dat eerst af en ga dan pas kijken wat youtube miss wel of miss niet doet.
omdat het een unique ID geeft..
uniek: session_id()
Zo kan je vaak de volgorde van een video's bepalen van iemand, iets wat niet echt altijd wenselijk is.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
function rand_uniqid($in, $to_num = false, $pad_up = false, $passKey = null)
{
$index = "bcdfghjklmnpqrtvwxyz_-0123456789BCDFGHJKLMNPQRTVWXYZ";
if ($passKey !== null) {
// Although this function's purpose is to just make the
// ID short - and not so much secure,
// you can optionally supply a password to make it harder
// to calculate the corresponding numeric ID
for ($n = 0; $n<strlen($index); $n++) {
$i[] = substr( $index,$n ,1);
}
$passhash = hash('sha256',$passKey);
$passhash = (strlen($passhash) < strlen($index))
? hash('sha512',$passKey)
: $passhash;
for ($n=0; $n < strlen($index); $n++) {
$p[] = substr($passhash, $n ,1);
}
array_multisort($p, SORT_DESC, $i);
$index = implode($i);
}
$base = strlen($index);
if ($to_num) {
// Digital number <<-- alphabet letter code
$in = strrev($in);
$out = 0;
$len = strlen($in) - 1;
for ($t = 0; $t <= $len; $t++) {
$bcpow = bcpow($base, $len - $t);
$out = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
}
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$out -= pow($base, $pad_up);
}
}
$out = sprintf('%F', $out);
$out = substr($out, 0, strpos($out, '.'));
} else {
// Digital number -->> alphabet letter code
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$in += pow($base, $pad_up);
}
}
$out = "";
for ($t = floor(log($in, $base)); $t >= 0; $t--) {
$bcp = bcpow($base, $t);
$a = floor($in / $bcp) % $base;
$out = $out . substr($index, $a, 1);
$in = $in - ($a * $bcp);
}
$out = strrev($out); // reverse
}
return $out;
}
?>
function rand_uniqid($in, $to_num = false, $pad_up = false, $passKey = null)
{
$index = "bcdfghjklmnpqrtvwxyz_-0123456789BCDFGHJKLMNPQRTVWXYZ";
if ($passKey !== null) {
// Although this function's purpose is to just make the
// ID short - and not so much secure,
// you can optionally supply a password to make it harder
// to calculate the corresponding numeric ID
for ($n = 0; $n<strlen($index); $n++) {
$i[] = substr( $index,$n ,1);
}
$passhash = hash('sha256',$passKey);
$passhash = (strlen($passhash) < strlen($index))
? hash('sha512',$passKey)
: $passhash;
for ($n=0; $n < strlen($index); $n++) {
$p[] = substr($passhash, $n ,1);
}
array_multisort($p, SORT_DESC, $i);
$index = implode($i);
}
$base = strlen($index);
if ($to_num) {
// Digital number <<-- alphabet letter code
$in = strrev($in);
$out = 0;
$len = strlen($in) - 1;
for ($t = 0; $t <= $len; $t++) {
$bcpow = bcpow($base, $len - $t);
$out = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
}
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$out -= pow($base, $pad_up);
}
}
$out = sprintf('%F', $out);
$out = substr($out, 0, strpos($out, '.'));
} else {
// Digital number -->> alphabet letter code
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$in += pow($base, $pad_up);
}
}
$out = "";
for ($t = floor(log($in, $base)); $t >= 0; $t--) {
$bcp = bcpow($base, $t);
$a = floor($in / $bcp) % $base;
$out = $out . substr($index, $a, 1);
$in = $in - ($a * $bcp);
}
$out = strrev($out); // reverse
}
return $out;
}
?>
Uitvoer:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
rand_uniqid(9007199254740989);
// heeft als returnwaarde: 'PpQXn7COf'
rand_uniqid('PpQXn7COf', true);
// heeft als returnwaarde: '9007199254740989'
?>
rand_uniqid(9007199254740989);
// heeft als returnwaarde: 'PpQXn7COf'
rand_uniqid('PpQXn7COf', true);
// heeft als returnwaarde: '9007199254740989'
?>
Edit:
Bron vermelding aangepast
Bron: 2e reactie uniqid
Gewijzigd op 19/08/2010 11:31:24 door B a s