Einen String hashenIch möchte eine Hash-Funktion in JMP für kurze Zeichenfolgen. (Ich benötige es, um anonymisierte ganzzahlige Datenbankschlüssel aus Zeilendaten zu erstellen.)
Es muss keine kryptografische Qualität aufweisen, sondern lediglich ein 64-Bit- (oder 128-Bit-)Ergebnis und eine relativ niedrige Kollisionsrate aufweisen. Ich habe versucht, Blob MD5() (mit Kürzung auf 64 Bit) zu verwenden, aber ich kann nicht glauben, wie langsam es ist. (Probieren Sie es einfach an einer Tabelle mit 500.000 Zeilen aus!).Hat jemand einen schnellen Hash-Algorithmus in JSL erstellt oder verlinkt? Wie wäre es mit dem Seeding des Zufallszahlengenerators von JSL mit einer Funktion der Eingabezeichenfolge? Ich brauche keine NIST-Qualität, aber ich brauche etwas Schnelles und nicht allzu schmutziges, das auf allen Plattformen das gleiche Ergebnis liefert.
Können Sie aus JSL heraus einen der vielen C++- oder Java-Hash-Algorithmen aufrufen, die es gibt? Wie?
PS: Vielleicht könnte JMP 14.1 einige bessere Hash-Funktion(en) in seine Standardbibliothek aufnehmen. Wie wäre es mit der Einbeziehung von SHA?
Betreff: Einen String hashenHier ist übrigens die Lösung, für die ich mich letztendlich entschieden habe:
// ==========================
// ::String Hash()
// ==========================
myStringHash = New Custom Function(
"Global",
"String Hash",
Function( {str, length = 64},
{bytes},
bytes = Match( length, 64, 8, 32, 4, Throw( "Bad argument in ::String Hash; hash length must be 64 (default) or 32." ) );
Subscript( Blob To Matrix( Blob Peek( Blob MD5( Char To Blob( str, "utf-8" ) ), 0, bytes ), "int", bytes, "little" ), 1 );
)
);
myStringHash << Description(
"Accepts a string as input, and returns an unsigned 64-bit or 32-bit integer hash of the string, generated by truncation of the (128-bit) MD5 hash of the input string.
The first parameter is the input string to be hashed.
The second, optional parameter is either the number 64 or the number 32. This selects whether the result will be a 64-bit (8-byte) integer, or a 32-bit (4-byte) integer. If not specified, the function defaults to 64-bit (8-byte). If a value other than 64 or 32 is entered, an error results."
);
myStringHash << Prototype( "::String Hash (string, <64|32>)" );
myStringHash << Example( "z = ::String Hash ( \!"This is a string\!" ); Show ( Format( z, 20, 0) )" );
myStringHash << Parameter( "String", "Input string" );
myStringHash << Parameter( "Number", "<64 or 32 (default is 64)>" );
myStringHash << Formula Category( "Database" );
Add Custom Functions( {myStringHash} );Betreff: Einen String hashenCraige,
Vielleicht war ich zu streng mit Blob MD5. Auf meinem Computer mit meinen Eingabezeichenfolgen ist es langsamer. Trotzdem vielen Dank für die objektive Prüfung.
John
Betreff: Einen String hashenDies dauert etwa 10 Sekunden für 1.000.000 Zeilen.
start = Tick Seconds();
dt = New Table( "Untitled",
Add Rows( 1e6 ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ), Formula( Row() ) ),
New Column( "Column 2", Character, "Nominal", Formula( Hex( Blob MD5( Char To Blob( Char( :Column 1 ) ) ) ) ) )
);
dt << runformulas; // run the formulas now, not in the background
stop = Tick Seconds();
Show( stop - start );
Using MD5 for hashUsing MD5 for hashVerwendung von MD5 für Hash
Betreff: Einen String hashenDanke für diese Lösung!
Leider verwende ich einen Mac und kann VBS daher nicht verwenden. Aber jetzt sehe ich anhand Ihres Beispiels, wie man RunProgram verwendet, und ich werde versuchen, es für CityHash zum Laufen zu bringen ( https://opensource.googleblog.com/2011/04/introducing-cityhash.html ).
Betreff: Einen String hashenJohn madden,
Ich bin kein Experte und dies entspricht möglicherweise nicht Ihren Anforderungen. Unten finden Sie ein VBscript für die SHA256- und MD5-Verschlüsselung. Sie finden es hier unter diesem Link.
https://gist.github.com/jermity/557de47a978f7a7c4a74
Ich kenne nur Windows.Kopieren Sie die angehängte Datei und ändern Sie die Erweiterung in .vbs. Öffnen Sie ein Befehlsfenster, wechseln Sie in das Speicherverzeichnis und geben Sie jerhash.vbs ein, um die Verwendungssyntax zu erhalten.Das eingebettete Skript konvertiert die Zustandsnamen. Dieses VBS-Skript scheint keine Werteliste zuzulassen. Die 52 Staatsnamen benötigten 8,2 Sekunden, und ich bin mir sicher, dass der Mehraufwand für die Verbindung mit dem Laufprogramm noch dazukommt. Das beigefügte Skript zeigt eine alternative Methode zum Erstellen einer .bat-Datei. Für die 52 Artikel dauerte es durchschnittlich etwa 0,1 Sekunden. Ich habe die Datei nicht eingelesen. Das ist ein anderer Ansatz. Generieren Sie die 500 KB offline und lesen Sie dann die Datei ein.
Das ist alles was ich habe.Grüße.

mytbl = New Table("testit", New Column("States", Character,
Values({"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut",
"District of Columbia", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho",
"Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine",
"Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri",
"Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",
"New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
"Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin",
"Wyoming"}) ), NewColumn("Code",Character)
);
t1 = tick seconds();
for(i=1, i<=nrow(mytbl), i++,
:Code[i] = Trim(RunProgram(Executable("cscript"),
Options(EvalInsert("\[//nologo c:\temp\jerhash.vbs /A:sha256 /S:"^:States[i]^"]\") ),
ReadFunction("text")
));
);
t2= tickseconds();
show(t2-t1);