Eenvoudige (niet-beveiligde) hashfunctie voor JavaScript?

Mogelijk duplicaat:
Genereer een hash van string in Javascript/jQuery

Kan iemand een eenvoudige (d.w.z. tientallen regels code, niet honderden regels) hash-functie voorstellen die is geschreven in (browser-compatibel) JavaScript? In het ideale geval zou ik iets willen dat, wanneer een string als invoer wordt doorgegeven, iets produceert dat lijkt op de hexadecimale tekenreeks van 32 tekens die de typische uitvoer is van MD5, SHA1, enz. Het hoeft niet cryptografisch veilig te zijn, maar redelijk bestand tegen botsingen . (Mijn eerste gebruiksvoorbeeld zijn URL’s, maar ik zal het in de toekomst waarschijnlijk op andere strings willen gebruiken.)


Antwoord 1, autoriteit 100%

Ik heb dit niet zelf geverifieerd, maar je kunt dit bekijken JavaScript-implementatie van Java’s String.hashCode()-methode. Lijkt redelijk kort.

Met dit prototype kun je eenvoudig .hashCode()aanroepen op elke string, b.v. "some string".hashCode()en ontvang een numerieke hashcode (meer specifiek een Java-equivalent) zoals 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;
}

Antwoord 2, autoriteit 8%

Er zijn veel realisaties van hash-functies geschreven in JS. Bijvoorbeeld:

Als je geen beveiliging nodig hebt, kun je ook base64 gebruiken, die geen hash-functie is, geen vaste uitvoer heeft en eenvoudig door de gebruiker kan worden gedecodeerd, maar ziet er lichter uit en kan worden gebruikt voor het verbergen van waarden: http://www.webtoolkit.info/javascript-base64.html


Antwoord 3, autoriteit 3%

Bekijk deze implementaties


Antwoord 4, autoriteit 2%

Eenvoudige object-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('');
    }
}());

Het vlees hier is de stringifier, die eenvoudig elk object omzet in een unieke string. hashCode loopt dan over het object, waarbij de karakters van het stringified object worden samengevoegd.

Exporteer voor extra punten de tekenreeks en maak een parser.


Antwoord 5

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

Antwoord 6

Bekijk deze MD5-implementatie voor JavaScript. Het heeft een BSD-licentie en is heel gemakkelijk te gebruiken. Voorbeeld:

md5 = hex_md5("message to digest")

Other episodes