web-dev-qa-db-fra.com

Fonction de hachage simple (non sécurisée) pour JavaScript?

Duplicate possible:
Générer un hachage à partir de chaîne en Javascript/jQuery

Quelqu'un peut-il suggérer une simple fonction de hachage (c'est-à-dire des dizaines de lignes de code, pas des centaines de lignes) écrite en JavaScript (compatible avec le navigateur)? Idéalement, j'aimerais quelque chose qui, lorsqu'il est passé avec une chaîne en tant qu'entrée, génère quelque chose de similaire à la chaîne hexadécimale de 32 caractères qui est la sortie typique de MD5, SHA1, etc. . (Mon cas d'utilisation initial concerne les URL, mais je souhaiterai probablement l'utiliser ultérieurement sur d'autres chaînes.)

108
mjs

Je n'ai pas vérifié cela moi-même, mais vous pouvez regarder ceci implémentation JavaScript de la méthode String.hashCode () de Java . Semble raisonnablement court.

Avec ce prototype, vous pouvez simplement appeler .hashCode() sur n’importe quelle chaîne, par exemple. "some string".hashCode(), et recevez un code de hachage numérique (plus précisément, un Java) tel que 1395333309.

String.prototype.hashCode = function() {
    var hash = 0;
    if (this.length == 0) {
        return hash;
    }
    for (var i = 0; i < this.length; i++) {
        var char = this.charCodeAt(i);
        hash = ((hash<<5)-hash)+char;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}
111
Barak

Il existe de nombreuses réalisations de fonctions de hachage écrites en JS. Par exemple:

Si vous n'avez pas besoin de sécurité, vous pouvez également utiliser base64 qui n'est pas une fonction de hachage, n'a pas de sortie fixe et peut être simplement décodé par l'utilisateur, mais semble plus léger et peut être utilisé pour les valeurs masquées: http: //www.webtoolkit.info/javascript-base64.html

8
silex

Objet simple hasher:

(function () {
    Number.prototype.toHex = function () {
        var ret = ((this<0?0x8:0)+((this >> 28) & 0x7)).toString(16) + (this & 0xfffffff).toString(16);
        while (ret.length < 8) ret = '0'+ret;
        return ret;
    };
    Object.hashCode = function hashCode(o, l) {
        l = l || 2;
        var i, c, r = [];
        for (i=0; i<l; i++)
            r.Push(i*268803292);
        function stringify(o) {
            var i,r;
            if (o === null) return 'n';
            if (o === true) return 't';
            if (o === false) return 'f';
            if (o instanceof Date) return 'd:'+(0+o);
            i=typeof o;
            if (i === 'string') return 's:'+o.replace(/([\\\\;])/g,'\\$1');
            if (i === 'number') return 'n:'+o;
            if (o instanceof Function) return 'm:'+o.toString().replace(/([\\\\;])/g,'\\$1');
            if (o instanceof Array) {
                r=[];
                for (i=0; i<o.length; i++) 
                    r.Push(stringify(o[i]));
                return 'a:'+r.join(';');
            }
            r=[];
            for (i in o) {
                r.Push(i+':'+stringify(o[i]))
            }
            return 'o:'+r.join(';');
        }
        o = stringify(o);
        for (i=0; i<o.length; i++) {
            for (c=0; c<r.length; c++) {
                r[c] = (r[c] << 13)-(r[c] >> 19);
                r[c] += o.charCodeAt(i) << (r[c] % 24);
                r[c] = r[c] & r[c];
            }
        }
        for (i=0; i<r.length; i++) {
            r[i] = r[i].toHex();
        }
        return r.join('');
    }
}());

La viande ici est le stringifier, qui convertit simplement n'importe quel objet en une chaîne unique. hashCode passe ensuite sur l'objet en hachant ensemble les caractères de l'objet stringifié.

Pour des points supplémentaires, exportez le stringifier et créez un analyseur.

3
Fordi

Cet article explique les fonctions de hachage simples en détail et fournit un exemple de code (en C) assez simple. On dirait que la fonction de hachage de Bob Jenkins pourrait convenir à vos besoins (this article du Dr Dobbs contient plus de détails et un aperçu des autres fonctions de hachage, qui pourraient toutes deux être utiles) .

3
Tom

Découvrez ces implémentations

3
Stefan Filip
// Simple but unreliable function to create string hash by Sergey.Shuchkin [t] gmail.com
// alert( strhash('http://www.w3schools.com/js/default.asp') ); // 6mn6tf7st333r2q4o134o58888888888
function strhash( str ) {
    if (str.length % 32 > 0) str += Array(33 - str.length % 32).join("z");
    var hash = '', bytes = [], i = j = k = a = 0, dict = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','1','2','3','4','5','6','7','8','9'];
    for (i = 0; i < str.length; i++ ) {
        ch = str.charCodeAt(i);
        bytes[j++] = (ch < 127) ? ch & 0xFF : 127;
    }
    var chunk_len = Math.ceil(bytes.length / 32);   
    for (i=0; i<bytes.length; i++) {
        j += bytes[i];
        k++;
        if ((k == chunk_len) || (i == bytes.length-1)) {
            a = Math.floor( j / k );
            if (a < 32)
                hash += '0';
            else if (a > 126)
                hash += 'z';
            else
                hash += dict[  Math.floor( (a-32) / 2.76) ];
            j = k = 0;
        }
    }
    return hash;
}
1
Sergey Shuchkin

Découvrez ceci implémentation MD5 pour JavaScript . Son BSD sous licence et vraiment facile à utiliser. Exemple:

md5 = hex_md5("message to digest")
0
jsalonen