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.
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.
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);
});
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ß!
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();
UUID v3 und UUID v5 sind eigentlich Hashes für eine bestimmte Eingabezeichenfolge.
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);
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 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.