文字列のハッシュ化JMPで短い文字列のハッシュ関数が必要です。 (行データから匿名化された整数データベースキーを作成するために必要です。)
暗号品質である必要はありません。必要なのは、結果が 64 ビット (または 128 ビット) であり、衝突率が適度に低いことだけです。 Blob MD5() (64 ビットに切り捨て) を使用してみましたが、信じられないほど遅いです。 (500,000 行のテーブルで試してみてください。)誰かが JSL で高速ハッシュ アルゴリズムを作成したり、それにリンクしたりしたことがありますか? JSL の乱数ジェネレーターに入力文字列の関数をシードするのはどうでしょうか? NIST 品質は必要ありませんが、すべてのプラットフォームで同じ結果が得られる、迅速でそれほど汚れのないものが必要です。
世の中にたくさんある C++ または Java ハッシュ アルゴリズムの 1 つを JSL 内から呼び出すことができますか? どうやって?
PS おそらく、JMP 14.1 には、標準ライブラリにいくつかのより優れたハッシュ関数が含まれる可能性があります。 SHA を含めるのはどうですか?
Re: 文字列のハッシュ化ちなみに、私が最終的にたどり着いた解決策は次のとおりです。
// ==========================
// ::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} );Re: 文字列のハッシュ化クレイジ
おそらく私は Blob MD5 に厳しすぎたのかもしれません。 私のマシンで入力文字列を使用した場合よりも遅くなります。 それでも、客観的なチェックをしていただきありがとうございます。
ジョン
Re: 文字列のハッシュ化これは 1,000,000 行で約 10 秒で実行されます。
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 hashハッシュに MD5 を使用する
Re: 文字列のハッシュ化この解決策をありがとう!
残念ながら、私は Mac を使用しているため、実際には vbs を使用できません。 しかし、今、あなたの例から RunProgram の使用方法がわかりました。それを CityHash で動作させるために試してみます ( https://opensource.googleblog.com/2011/04/introducing-cityhash.html )。
Re: 文字列のハッシュ化ジョン・マッデン、
私は専門家ではないので、あなたのニーズに応えられない可能性があります。 以下は、SHA256 と MD5 暗号化の両方の VBscript です。このリンクから見つけてください。
https://gist.github.com/jermity/557de47a978f7a7c4a74
Windowsしか知りません。添付ファイルをコピーし、拡張子を .vbs に変更します。 コマンド ウィンドウを開き、cd で保存ディレクトリに移動し、「jerhash.vbs」と入力して使用構文を取得します。埋め込みスクリプトは状態名を変換します。 この vbs スクリプトでは値のリストを使用できないようです。 52 の状態名には 8.2 秒かかりましたが、実行プログラムの接続によるオーバーヘッドがさらにかかると思います。 添付のスクリプトは、.bat ファイルを作成する別の方法を示しています。 52 項目の平均所要時間は約 0.1 秒でした。 ファイルを読み込んでいませんでした。 それは別のアプローチです。 500k をオフラインで生成し、ファイルを読み取ります。
それは私が持っているすべてです。よろしく。

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