Hashing di una stringaVoglio una funzione hash in JMP per stringhe brevi. (Ne ho bisogno per creare chiavi di database intere anonimizzate dai dati delle righe.)
Non è necessario che sia di qualità crittografica, deve solo avere un risultato a 64 bit (o 128 bit) e avere un tasso di collisione ragionevolmente basso. Ho provato a utilizzare Blob MD5() (con troncamento a 64 bit), ma non riesco a credere quanto sia lento. (Basta provarlo su una tabella con 500.000 righe!).Qualcuno ha creato o collegato un algoritmo hash veloce in JSL? Che ne dici di seminare il generatore di numeri casuali di JSL con qualche funzione della stringa di input? Non ho bisogno della qualità NIST, ma ho bisogno di qualcosa di veloce e non eccessivamente sporco che dia lo stesso risultato su tutte le piattaforme.
Puoi chiamare da JSL uno dei tanti algoritmi hash C++ o Java disponibili? Come?
PS Forse JMP 14.1 potrebbe includere alcune funzioni hash migliori nella sua libreria standard. Che ne dici di includere SHA?
Ri: Hashing di una stringaA proposito, ecco la soluzione che ho finalmente scelto:
// ==========================
// ::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} );Ri: Hashing di una stringaCraige,
Forse sono stato troppo duro con Blob MD5. È più lento di quello sulla mia macchina con le mie stringhe di input. Grazie comunque per il controllo oggettivo.
John
Ri: Hashing di una stringaViene eseguito in circa 10 secondi su 1.000.000 di righe.
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 hashUtilizzo di MD5 per l'hash
Ri: Hashing di una stringaGrazie per questa soluzione!
Sfortunatamente, sono su Mac, quindi non posso effettivamente usare vbs. Ma ora vedo dal tuo esempio come utilizzare RunProgram e proverò a farlo funzionare per CityHash ( https://opensource.googleblog.com/2011/04/introducing-cityhash.html ).
Ri: Hashing di una stringaJohn_Madden,
Non sono un esperto e questo potrebbe non soddisfare le tue esigenze. Di seguito è riportato uno script VB per la crittografia SHA256 e MD5. Lo trovi qui a questo collegamento.
https://gist.github.com/jermity/557de47a978f7a7c4a74
Conosco solo Windows.Copia il file allegato e modifica l'estensione in .vbs. Apri una finestra di comando, vai alla directory di salvataggio e digita jerhash.vbs per ottenere la sintassi di utilizzo.Lo script incorporato converte i nomi degli stati. Questo script vbs non sembra consentire un elenco di valori. I 52 nomi di stato hanno impiegato 8,2 secondi e sono sicuro che il sovraccarico per la connessione del programma di esecuzione si aggiunge a questo. Lo script allegato mostra un metodo alternativo per creare un file .bat. ci sono voluti in media circa 0,1 secondi per i 52 elementi. Non ho letto il file. Questo è un altro approccio. Genera i 500k offline quindi leggi il file.
Questo è tutto quello che ho.Saluti.

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);