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.

63voto

Kaiido Punkte 101425

Ich bin ein wenig überrascht, dass noch niemand über die neue SubtleCrypto API noch nicht.

Um einen Hash aus einer Zeichenkette zu erhalten, können Sie die subtle.digest Methode:

function getHash(str, algo = "SHA-256") {
  let strBuf = new TextEncoder().encode(str);
  return crypto.subtle.digest(algo, strBuf)
    .then(hash => {
      window.hash = hash;
      // here hash is an arrayBuffer, 
      // so we'll connvert it to its hex version
      let result = '';
      const view = new DataView(hash);
      for (let i = 0; i < hash.byteLength; i += 4) {
        result += ('00000000' + view.getUint32(i).toString(16)).slice(-8);
      }
      return result;
    });
}

getHash('hello world')
  .then(hash => {
    console.log(hash);
  });

44voto

mjs Punkte 19667

Dies ist eine verfeinerte und leistungsfähigere Variante, und passt zu Java's Umsetzung der Norm object.hashCode() para CharSequence .

String.prototype.hashCode = function() {
    var hash = 0, i = 0, len = this.length;
    while ( i < len ) {
        hash  = ((hash << 5) - hash + this.charCodeAt(i++)) << 0;
    }
    return hash;
};

Hier ist auch eine, die nur positiv Hashcodes:

String.prototype.hashcode = function() {
    return this.hashCode()+ 2147483647 + 1;
};

Und hier ist ein passendes Exemplar für Java die nur positive Hashcodes zurückgibt:

public static long hashcode(Object obj) {
    return ((long) obj.hashCode()) + Integer.MAX_VALUE + 1l;
}

Ohne Prototyp für diejenigen, die ihn nicht anbringen wollen String :

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

function hashcode(str) {
    hashCode(str) + 2147483647 + 1;
}

Viel Spaß!

30voto

Kyle Falconer Punkte 7926

Falls es jemandem hilft, habe ich die beiden ersten Antworten zu einer Version kombiniert, die ältere Browser toleriert und die schnelle Version verwendet, wenn reduce verfügbar ist, und greift andernfalls auf die Lösung von esmiralha zurück.

/**
 * @see http://stackoverflow.com/q/7616461/940217
 * @return {number}
 */
String.prototype.hashCode = function(){
    if (Array.prototype.reduce){
        return this.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0);              
    } 
    var hash = 0;
    if (this.length === 0) return hash;
    for (var i = 0; i < this.length; i++) {
        var character  = this.charCodeAt(i);
        hash  = ((hash<<5)-hash)+character;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}

Die Verwendung ist wie:

var hash = "some string to be hashed".hashCode();

25voto

bvdb Punkte 18946

UUID v3 und UUID v5 sind eigentlich Hashes für eine bestimmte Eingabezeichenfolge.

  • Die UUID v3 basiert auf MD5,
  • Die UUID v5 basiert auf SHA-1.

Die naheliegendste Wahl wäre also die UUID v5.

Glücklicherweise gibt es ein beliebtes npm-Paket, das alle UUID-Algorithmen enthält.

npm install uuid

Um eine UUID v5 zu erzeugen, benötigen Sie einen eindeutigen Namensraum. Dieser Namespace wirkt wie ein Seed und sollte eine Konstante sein, um sicherzustellen, dass die Ausgabe für eine gegebene Eingabe immer dieselbe ist. Ironischerweise sollten Sie eine UUID v4 als Namespace erzeugen. Der einfachste Weg, dies zu tun, ist mit Hilfe eines Online-Tools .

Sobald Sie einen Namespace haben, sind Sie bereit.

import { v5 as uuidv5 } from 'uuid';

const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341';
const hash = uuidv5('input', MY_NAMESPACE);

Wenn Ihr Eingabestring zum Beispiel immer eine URL ist, gibt es einige Standard-Namensräume, die Sie verwenden können.

const hashForURL = uuidv5('https://www.w3.org/', uuidv5.URL);

14voto

Ariel Jiménez Punkte 121

Ich bin zwar etwas spät dran, aber Sie können dieses Modul verwenden: Krypto :

const crypto = require('crypto');

const SALT = '$ome$alt';

function generateHash(pass) {
  return crypto.createHmac('sha256', SALT)
    .update(pass)
    .digest('hex');
}

Das Ergebnis dieser Funktion ist immer 64 Zeichenfolge; etwa so: "aa54e7563b1964037849528e7ba068eb7767b1fab74a8d80fe300828b996714a"

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