960 Stimmen

Erzeugen eines Hash aus einem String in Javascript

Ich muss Zeichenketten in eine Form von Hash konvertieren. Ist dies in JavaScript möglich?

Ich verwende keine serverseitige Sprache, also kann ich es nicht auf diese Weise tun.

2voto

Nick Steele Punkte 6517

Ich füge dies hinzu, weil es noch niemand getan hat, und dies scheint gefragt zu sein und wird oft mit Hashes implementiert, aber es ist immer sehr schlecht gemacht...

Diese Funktion nimmt eine Zeichenketteneingabe und eine maximale Zahl, die der Hash gleich sein soll, und erzeugt eine eindeutige Zahl auf der Grundlage der Zeichenketteneingabe.

Sie können dies verwenden, um einen eindeutigen Index in einem Array von Bildern zu erzeugen (wenn Sie einen bestimmten Avatar für einen Benutzer zurückgeben möchten, der nach dem Zufallsprinzip ausgewählt wird, aber auch auf der Grundlage seines Namens ausgewählt wird, so dass er immer jemandem mit diesem Namen zugeordnet wird).

Sie können dies natürlich auch verwenden, um einen Index in einem Array von Farben zurückzugeben, z. B. um eindeutige Avatar-Hintergrundfarben basierend auf dem Namen einer Person zu erzeugen.

function hashInt (str, max = 1000) {
    var hash = 0;
    for (var i = 0; i < str.length; i++) {
      hash = ((hash << 5) - hash) + str.charCodeAt(i);
      hash = hash & hash;
    }
    return Math.round(max * Math.abs(hash) / 2147483648);
}

2voto

John Doherty Punkte 2998

Dies erzeugt einen konsistenten Hash, der auf einer beliebigen Anzahl von übergebenen Parametern basiert:

/**
 * Generates a hash from params passed in
 * @returns {string} hash based on params
 */
function fastHashParams() {
    var args = Array.prototype.slice.call(arguments).join('|');
    var hash = 0;
    if (args.length == 0) {
        return hash;
    }
    for (var i = 0; i < args.length; i++) {
        var char = args.charCodeAt(i);
        hash = ((hash << 5) - hash) + char;
        hash = hash & hash; // Convert to 32bit integer
    }
    return String(hash);
}

fastHashParams('hello world') Ausgänge "990433808"

fastHashParams('this',1,'has','lots','of','params',true) Ausgänge "1465480334"

2voto

swornabsent Punkte 984

Ich habe mich für eine einfache Verkettung von Zeichencodes entschieden, die in Hex-Strings umgewandelt wurden. Dies dient einem relativ engen Zweck, nämlich der Notwendigkeit einer Hash-Repräsentation einer KURZEN Zeichenkette (z.B. Titel, Tags), die mit einem Server ausgetauscht werden soll, der aus nicht relevanten Gründen den akzeptierten hashCode-Java-Port nicht einfach implementieren kann. Offensichtlich keine Sicherheitsanwendung hier.

String.prototype.hash = function() {
  var self = this, range = Array(this.length);
  for(var i = 0; i < this.length; i++) {
    range[i] = i;
  }
  return Array.prototype.map.call(range, function(i) {
    return self.charCodeAt(i).toString(16);
  }).join('');
}

Dies kann mit Underscore knapper und browser-toleranter gestaltet werden. Beispiel:

"Lorem Ipsum".hash()
"4c6f72656d20497073756d"

Ich nehme an, wenn Sie größere Zeichenketten auf ähnliche Weise hashen wollen, könnten Sie einfach die Zeichencodes reduzieren und die resultierende Summe hexifizieren, anstatt die einzelnen Zeichen miteinander zu verketten:

String.prototype.hashLarge = function() {
  var self = this, range = Array(this.length);
  for(var i = 0; i < this.length; i++) {
    range[i] = i;
  }
  return Array.prototype.reduce.call(range, function(sum, i) {
    return sum + self.charCodeAt(i);
  }, 0).toString(16);
}

'One time, I hired a monkey to take notes for me in class. I would just sit back with my mind completely blank while the monkey scribbled on little pieces of paper. At the end of the week, the teacher said, "Class, I want you to write a paper using your notes." So I wrote a paper that said, "Hello! My name is Bingo! I like to climb on things! Can I have a banana? Eek, eek!" I got an F. When I told my mom about it, she said, "I told you, never trust a monkey!"'.hashLarge()
"9ce7"

Natürlich besteht bei dieser Methode ein höheres Kollisionsrisiko, aber man kann mit der Arithmetik beim Reduzieren herumspielen, wie man will, um den Hash zu diversifizieren und zu verlängern.

1voto

crazy2be Punkte 1937

Leicht vereinfachte Version von @esmiralha's Antwort.

Ich überschreibe String in dieser Version nicht, da dies zu einem unerwünschten Verhalten führen könnte.

function hashCode(str) {
    var hash = 0;
    for (var i = 0; i < str.length; i++) {
        hash = ~~(((hash << 5) - hash) + str.charCodeAt(i));
    }
    return hash;
}

-3voto

Joshi-pixal Punkte 1
function hashCode(str) {
  return str.split('').reduce((prevHash, currVal) =>
    (((prevHash << 5) - prevHash) + currVal.charCodeAt(0))|0, 0);
}

// Test
console.log("hashCode(\"Hello!\"): ", hashCode('Hello!'));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X