it-swarm-eu.dev

Funzione hash semplice (non sicura) per JavaScript?

Possibile duplicato:
Genera un hash dalla stringa in Javascript/jQuery

Qualcuno può suggerire una semplice funzione hash (cioè decine di righe di codice, non centinaia di righe) scritta in JavaScript (compatibile con il browser)? Idealmente, vorrei qualcosa che, quando passava una stringa come input, produce qualcosa di simile alla stringa esadecimale di 32 caratteri che è l'output tipico di MD5, SHA1, ecc. Non deve essere crittograficamente sicuro, ma ragionevolmente resistente alle collisioni . (Il mio caso d'uso iniziale è l'URL, ma probabilmente in futuro lo userò su altre stringhe.)

108
mjs

Non l'ho verificato da solo, ma puoi guardare questo implementazione JavaScript del metodo String.hashCode () di Java . Sembra ragionevolmente breve.

Con questo prototipo puoi semplicemente chiamare .hashCode() su qualsiasi stringa, ad es. "some string".hashCode() e ricevi un codice hash numerico (più precisamente, a Java) come 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

Esistono molte realizzazioni di funzioni hash scritte in JS. Per esempio:

Se non hai bisogno di sicurezza, puoi anche usare base64 che non è una funzione hash, non ha un output fisso e potrebbe essere semplicemente decodificato dall'utente, ma sembra più leggero e potrebbe essere usato per nascondere i valori: http: //www.webtoolkit.info/javascript-base64.html

8
silex

Hash dell'oggetto semplice:

(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 carne qui è il stringificatore, che converte semplicemente qualsiasi oggetto in una stringa univoca. hashCode viene quindi eseguito sopra l'oggetto, eseguendo l'hashing dei caratteri dell'oggetto sottoposto a stringhe.

Per punti extra, esporta il stringificatore e crea un parser.

3
Fordi

Questo articolo spiega semplici funzioni hash in alcuni dettagli e fornisce un codice di esempio (in C) che è piuttosto diretto. Sembra che la funzione hash di Bob Jenkins potrebbe essere appropriata per le tue esigenze (questo articolo del Dr Dobbs ha più dettagli e un sondaggio di altre funzioni hash, che potrebbero essere utili) .

3
Tom
// 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

Dai un'occhiata a questo implementazione MD5 per JavaScript . È concesso in licenza BSD e davvero facile da usare. Esempio:

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