문자열 해싱짧은 문자열에 대한 JMP의 해시 함수를 원합니다. (행 데이터에서 익명화된 정수 데이터베이스 키를 생성하려면 이 정보가 필요합니다.)
암호화 품질이 필요하지 않으며 64비트(또는 128비트) 결과가 필요하고 충돌률이 합리적으로 낮으면 됩니다. Blob MD5()(64비트로 잘림)를 사용해 보았지만 얼마나 느린지 믿을 수 없습니다. (500,000개의 행이 있는 테이블에서 시도해 보세요!)JSL에서 빠른 해시 알고리즘을 만들거나 연결한 사람이 있나요? 입력 문자열의 일부 기능을 사용하여 JSL의 난수 생성기를 시드하는 것은 어떻습니까? NIST 품질은 필요하지 않지만 모든 플랫폼에서 동일한 결과를 제공할 수 있는 빠르고 지저분하지 않은 것이 필요합니다.
JSL 내에서 존재하는 많은 C++ 또는 Java 해시 알고리즘 중 하나를 호출할 수 있습니까? 어떻게?
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
저는 윈도우만 알고 있어요.첨부파일을 복사하고 확장자를 .vbs로 변경하세요. 명령 창을 열고 저장 디렉터리로 이동한 후 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);