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.


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


I used it on my


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);


    //This page is responsible to return a JSON object
    //code starts after the functions for those who might get confused xD

    header('content-type: application/json; charset=utf-8');

    global $responseData;

    function AdjustRate($Ra, $Ea, $Sa)
        //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;
            $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)) {
            $winner->rate = AdjustRate($winner->rate, $winner->E, 1);
            $looser->rate = AdjustRate($looser->rate, $looser->E, 0);

        // 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;

            $updateQuery = 'UPDATE user SET rate='.$looser->rate.' WHERE id=' . $looser->id;

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


    // 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)

    // 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 ?
    $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;

    // 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);

    my @links = $mech->images();

    $count = 0;

    for my $link ( @links ) 
    $file = $dir.$count.".jpg";


    print $file," : "$link->url,"\n";

    print $doc $link->url." ".$file."\n";

  close $doc;


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



Need Your Help

JavaScript URL Decode function

javascript jquery urlencode urldecode

What's the best JavaScript URL decode utility? Encoding would be nice too and working well with jQuery is an added bonus.

Are there any real alternatives to reStructuredText for Python documentation?

python documentation python-sphinx restructuredtext docstring

I'm starting an open source Python project shortly and I'm trying to decide in advance how to write my docstrings. The obvious answer would be using reStructuredText and Sphinx with autodoc, becaus...