# Facemash algorithm

Does anyone know the facemash algorithm that Mark Zuckerberg implemented in his facemash site? http://www.thecrimson.com/article/2003/11/19/facemash-creator-survives-ad-board-the/

Preferably in PHP & MySQL.

I don't know what algorithm was actually used for the real-world site, but what they write on the window in the movie is based on the Elo rating system, which originated in the chess world and is now also used in many other games.

UPDATE:

As I said in the comments, I've added this algerithm to my new website. At first it seemed to work perfectly. But after some weird inputs some strange result began to form.

While debugging I figured out what I was doing wrong. When getting the score for a "direct relationship" (used in the indirect relationship too) between 2 nodes I added the scores together. This was wrong, the score of a direct relationship should be expressed in -1 to +1, where:

```-1 = lost everything
+1 = won everything
```

So if A won 8 times to B, and B won 2 times to A the score should be:

```(A wins) 8 + (B wins) 2 = (total matches)10
(delta of -1 and +1 =) 2 / (total matches)10 = (points per win) 0.2
Score of A vs B = (points per win) 0.2 * (wins) 8 - 1 = 0.6
Score of B vs A = (points per win) 0.2 * (wins) 2 - 1 = -0.4
```

Also I didn't mention this in the original explanation but it is all about triangles. So when we look at the indirect score, you don't need to go any further than 1 hop.

I recreated it aswell check it out. Not sure about php but the C# class is

http://lukedurrant.com/2010/11/c-elo-rating-class-used-on-facemash-as-seen-in-the-social-network-movie/

I used it on my

Facemash

Key press code is

```\$(document).keydown(function(event) {
if (event.keyCode == 37) {
//Voted Face 1
Rate("face1", false);
}
if(event.keyCode == 39) {
//Voted Face 2
Rate("face2", false);
}

});
```

```    <?php
//code starts after the functions for those who might get confused xD

global \$responseData;

{
//i used my own rules here 32 points for less than 500
if(\$Ra < 500)
\$k = 32;
elseif (\$Ra < 1000)//24 points for anything between 500 and 1000
\$k = 24;
else
\$k = 16;//16 for anything more than 1000

return \$Ra + (\$k*(\$Sa - \$Ea));
}

function GetExpectedChance(\$rA, \$rB) // the ELO formula taken from http://en.wikipedia.org/wiki/Elo_rating_system
{
return (1/(1+pow(10,((\$rB-\$rA)/400))));
}

function setNewRates(\$lastCall) // function I used to update my database tables
{
global \$responseData;

\$A = \$lastCall->p1;
\$B = \$lastCall->p2;
\$C = \$lastCall->c;
\$A->E = GetExpectedChance(\$A->rate, \$B->rate);
\$B->E = GetExpectedChance(\$B->rate, \$A->rate);

// decide who won and who lost
if(\$A->id == \$C){
\$winner = \$A;
\$looser = \$B;
}
elseif (\$B->id == \$C) {
\$winner = \$B;
\$looser = \$A;
}

// 3 cases, in all of them winner will get his rate/hits increased by 1
//Case #1: normal case we just update rate/hits for the winner, this applies all the time
\$winner->rate += 1;
\$winner->hits += 1;
//Case #2 / #3 : here we should adjust the rate after applying case #1
// if he won while he is expected to lose OR if he lost while expected to win
// there should be minimum rate different of 40 between the two
\$diff = abs(\$winner->rate - \$looser->rate);
if(\$diff >= 40 && (\$winner->E < 0.5 || \$looser->E >= 0.5)) {
}

// update the db to update rates, hits for both winner and looser
\$updateQuery = 'UPDATE user SET rate='.\$winner->rate.',hits='.\$winner->hits.' WHERE id=' . \$winner->id;
mysql_query(\$updateQuery);

\$updateQuery = 'UPDATE user SET rate='.\$looser->rate.' WHERE id=' . \$looser->id;
mysql_query(\$updateQuery);

// Save to responsedate
\$responseData->winner = \$winner;
\$responseData->looser = \$looser;
}

//CODE STARTS HERE :)

// Setup the mysql connection
include 'db.php';
// Part 1: calculate the rate and save to db, if we have a lastcall
// GET the last call data object, it has p1, p2, c, these are the items i recieved from my javascript ajax call
\$lastCall  = json_decode((string)\$_GET['lastCall']); // it was a JSON object so i need to decode it first
// Save last call data, will be sent with the respond as well
\$responseData->lastCall = \$lastCall;

// if there is a json object, means that there was a rating process and I have to set the new rates
if(\$lastCall->c != NULL)
{
setNewRates(\$responseData->lastCall);
}

// Part 3: Select new persons and addthem to our responseData
\$q = Array();
\$q[0] = 'SELECT id, name, sex, rate, hits FROM user WHERE fm_status=1 AND sex="female" ORDER BY RAND() LIMIT 2';
\$q[1] = 'SELECT id, name, sex, rate, hits FROM user WHERE fm_status=1 AND sex="male" ORDER BY RAND() LIMIT 2';

// girls or boys ?
srand(mktime());
\$query = \$q[array_rand(\$q)];
\$result1 = QueryIntoArray(\$query);
\$responseData->user = \$result1;

// Part 4: encode to JSON/JSONP string then respond to the call
\$json = json_encode(\$responseData);
\$json = isset(\$_GET['callback'])? "{\$_GET['callback']}(\$json)" : \$json;
echo \$json;

mysql_close();
// by Noor Syron :)
//I used this in my www.mimm.me

?>
```

`I have designed the code in Perl all from google searching and it works.

Here's It

```use strict;
use warnings;
use WWW::Mechanize;
use LWP::Simple;

sub images()
{
my \$mech = WWW::Mechanize->new();
my (\$site,\$count,\$file,\$dir);
print "\t\t\tDesigned By NUMWARZ GAMING\n\n";
print "Enter the name of the site you want to search for images\t:\n";
\$site = <STDIN>;

print "Enter the folder where you want to save this\t:\n";

\$dir = <STDIN>;

open my \$doc, ">" , \$dir."sitelist.txt";

\$mech->get( \$site);

\$count = 0;

{
\$file = \$dir.\$count.".jpg";

\$count+=1;
}
close \$doc;
exit;
}

images();
```

No not here not anywhere on the web. The Facemash source code has never been released to the public. The only one, who might still have a copy is Mark Zuckerberg himself.

here is a clone of facemash available http://www.facemash.99k.org

I've recreated it as well, but in a WordPress plugin

http://pofornot.com/

http://codecanyon.net/item/pics-mash-image-rating-tool/3256459?ref=mikemayhem3030