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.

13voto

Amirhe Punkte 1631

Hier ist ein kompakter, ES6-freundlicher und lesbarer Ausschnitt

const stringHashCode = str => {
  let hash = 0
  for (let i = 0; i < str.length; ++i)
    hash = Math.imul(31, hash) + str.charCodeAt(i)

  return hash | 0
}

8voto

John Smith Punkte 540

Mein kurzer (sehr langer) One-Liner basierend auf FNV's Multiply+Xor método:

my_string.split('').map(v=>v.charCodeAt(0)).reduce((a,v)=>a+((a<<7)+(a<<3))^v).toString(16);

7voto

djabraham Punkte 766

Dank des Beispiels von mar10 habe ich einen Weg gefunden, die gleichen Ergebnisse in C# UND Javascript für ein FNV-1a zu erhalten. Wenn Unicode-Zeichen vorhanden sind, wird der obere Teil aus Gründen der Leistung verworfen. Ich weiß nicht, warum es hilfreich wäre, diese zu erhalten, wenn Hashing, wie bin nur Hashing url Pfade für jetzt.

C#-Version

private static readonly UInt32 FNV_OFFSET_32 = 0x811c9dc5;   // 2166136261
private static readonly UInt32 FNV_PRIME_32 = 0x1000193;     // 16777619

// Unsigned 32bit integer FNV-1a
public static UInt32 HashFnv32u(this string s)
{
    // byte[] arr = Encoding.UTF8.GetBytes(s);      // 8 bit expanded unicode array
    char[] arr = s.ToCharArray();                   // 16 bit unicode is native .net 

    UInt32 hash = FNV_OFFSET_32;
    for (var i = 0; i < s.Length; i++)
    {
        // Strips unicode bits, only the lower 8 bits of the values are used
        hash = hash ^ unchecked((byte)(arr[i] & 0xFF));
        hash = hash * FNV_PRIME_32;
    }
    return hash;
}

// Signed hash for storing in SQL Server
public static Int32 HashFnv32s(this string s)
{
    return unchecked((int)s.HashFnv32u());
}

JavaScript-Version

var utils = utils || {};

utils.FNV_OFFSET_32 = 0x811c9dc5;

utils.hashFnv32a = function (input) {
    var hval = utils.FNV_OFFSET_32;

    // Strips unicode bits, only the lower 8 bits of the values are used
    for (var i = 0; i < input.length; i++) {
        hval = hval ^ (input.charCodeAt(i) & 0xFF);
        hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);
    }

    return hval >>> 0;
}

utils.toHex = function (val) {
    return ("0000000" + (val >>> 0).toString(16)).substr(-8);
}

7voto

SubtleCrypto.digest

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

Bist du sicher, dass du es nicht schaffst? auf diese Weise ?

Haben Sie vergessen, dass Sie Javascript verwenden, die Sprache, die sich ständig weiterentwickelt?

Essayez SubtleCrypto . Es unterstützt die Hash-Funktionen SHA-1, SHA-128, SHA-256 und SHA-512.


async function hash(message/*: string */) {
    const text_encoder = new TextEncoder;
    const data = text_encoder.encode(message);
    const message_digest = await window.crypto.subtle.digest("SHA-512", data);
    return message_digest;
} // -> ArrayBuffer

function in_hex(data/*: ArrayBuffer */) {
    const octets = new Uint8Array(data);
    const hex = [].map.call(octets, octet => octet.toString(16).padStart(2, "0")).join("");
    return hex;
} // -> string

(async function demo() {
    console.log(in_hex(await hash("Thanks for the magic.")));
})();

6voto

soulmachine Punkte 3487

Ein schnelles und prägnantes Beispiel, das von aquí :

String.prototype.hashCode = function() {
  var hash = 5381, i = this.length
  while(i)
    hash = (hash * 33) ^ this.charCodeAt(--i)
  return hash >>> 0;
}

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