Xxhash: λ¬Έμžμ—΄ ν•΄μ‹œ κ²°ν•©

에 λ§Œλ“  2017λ…„ 10μ›” 07일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: Cyan4973/xxHash

64λΉ„νŠΈ PowerPCλ₯Ό μ‚¬μš©ν•˜κ³  μ—°μ†λ˜μ§€ μ•Šμ€ λ¬Έμžμ—΄μ— λŒ€ν•΄ 32λΉ„νŠΈ ν•΄μ‹œ κ²°κ³Όλ₯Ό μ›ν•©λ‹ˆλ‹€.

XXH64λ₯Ό μ‚¬μš©ν•˜μ—¬ 일련의 비연속 λ¬Έμžμ—΄μ„ ν•΄μ‹œν•˜κ³  각 ν•΄μ‹œμ˜ κ²°κ³Όλ₯Ό λ‹€μŒ XXH64 호좜의 μ‹œλ“œλ‘œ μ „λ‹¬ν•˜λ©΄ ν•΄μ‹œ ν’ˆμ§ˆμ— 손싀이 μžˆμŠ΅λ‹ˆκΉŒ? λ˜ν•œ λ¬Έμžμ—΄ μ‹œν€€μŠ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ΅œμ’… 단일 32λΉ„νŠΈ ν•΄μ‹œ κ°’μœΌλ‘œ μ΅œμ’… 결과의 ν•˜μœ„ 32λΉ„νŠΈλ§Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

동일할 κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λŠ” 후속 ν•΄μ‹œλŠ” μ •ν™•νžˆ λ™μΌν•œ λ¬Έμžμ—΄ μ‹œν€€μŠ€μ— λŒ€ν•΄ μˆ˜ν–‰λ©λ‹ˆλ‹€. 즉, 이 μ‹œν€€μŠ€ "STRING1", "STRING2"의 μ΅œμ’… ν•΄μ‹œκ°€ "STRIN", "G1STRING2"의 μ΅œμ’… ν•΄μ‹œμ™€ 동일할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ‚΄ ν˜„μž¬ μ½”λ“œλŠ” CRC32λ₯Ό μ‚¬μš©ν•˜κ³  μœ„μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€(쀑간 κ²°κ³Όλ₯Ό λ‹€μŒ λ¬Έμžμ—΄μ— μ‹œλ“œλ‘œ 전달).

감사 ν•΄μš”.

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

신경쓰지 λ§ˆμ„Έμš”. 이제 XXH64κ°€ 64λΉ„νŠΈ μ‹œλ“œ 값을 ν—ˆμš©ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  6 λŒ“κΈ€

XXH64λ₯Ό μ‚¬μš©ν•˜μ—¬ 일련의 비연속 λ¬Έμžμ—΄μ„ ν•΄μ‹œν•˜κ³  각 ν•΄μ‹œμ˜ κ²°κ³Όλ₯Ό λ‹€μŒ XXH64 호좜의 μ‹œλ“œλ‘œ μ „λ‹¬ν•˜λ©΄ ν•΄μ‹œ ν’ˆμ§ˆμ— 손싀이 μžˆμŠ΅λ‹ˆκΉŒ?

큰 손싀이 μžˆμŠ΅λ‹ˆλ‹€.

XXH64_state_t , XXH64_update_endian 및 XXH64_digest_endian λ‚΄λΆ€λ₯Ό μ‚΄νŽ΄λ³΄μ‹­μ‹œμ˜€.
XXH64κ°€ XXH64_state_t 의 멀버 λ³€μˆ˜ v1 , v2 , v3 , v4 , total_len μ‚¬μš©(μ“°κΈ° 및 읽기)ν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ unsigned long long ( uint_64 , 64λΉ„νŠΈ λΆ€ν˜Έ μ—†λŠ” μ •μˆ˜)μž…λ‹ˆλ‹€.

μš°λ¦¬λŠ” 말할 μˆ˜μžˆλ‹€:
(1) XXH64_state 의 총 λΉ„νŠΈ μˆ˜κ°€ 64λΉ„νŠΈλ³΄λ‹€ ν½λ‹ˆλ‹€.
(2) ν•œ 번 μƒνƒœλ₯Ό 64λΉ„νŠΈ κ°’μœΌλ‘œ μ΅œμ†Œν™”(λ‹€μ΄μ œμŠ€νŠΈ)ν•˜λ©΄ λ§Žμ€ 정보가 사라진닀.

λ”°λΌμ„œ 가정을 κΈ°λŒ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 슀트리밍 κΈ°λŠ₯ μ‚¬μš©μ„ κ³ λ €ν•˜μ‹­μ‹œμ˜€.

@t-matμ—μ„œ μ œμ•ˆν•œ λŒ€λ‘œ 슀트리밍 κΈ°λŠ₯은 μ‹€μ œλ‘œ 이 μ‹œλ‚˜λ¦¬μ˜€μ— 맞게 μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 당신이 속도에 λŒ€ν•΄ κ±±μ •ν•˜κ³  μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.
ν•œ ν•΄μ‹œμ—μ„œ λ‹€μŒ ν•΄μ‹œλ‘œ κ²°κ³Όλ₯Ό μ „λ‹¬ν•˜μ—¬ 아무 것도 얻을 수 μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
슀트리밍 μ»¨ν…μŠ€νŠΈλ₯Ό μœ μ§€ν•˜λŠ” 것은 μ‹€μ œλ‘œ λΉ„μš©μ΄ λ“€μ§€λ§Œ ν•΄μ‹œλ₯Ό λ§ˆλ¬΄λ¦¬ν•˜λŠ” 것도 λΉ„μš©μ΄ λ“­λ‹ˆλ‹€. λͺ‡ λ°”μ΄νŠΈλ§ˆλ‹€ ν•΄μ‹œλ₯Ό μ’…λ£Œν•˜λŠ” 것은 XXH_digest() κ°€ 호좜될 λ•Œ μ’…λ£Œκ°€ ν•œ 번만 μˆ˜ν–‰λ˜λŠ” 슀트리밍 μ»¨ν…μŠ€νŠΈλ₯Ό μœ μ§€ν•˜λŠ” 것보닀 μ‹€μ œλ‘œ 더 λ§Žμ€ λΉ„μš©μ΄ λ“€ κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

제 λͺ©ν‘œλŠ” CRC32 μ‚¬μš©μ— λŒ€ν•œ 'λ“œλ‘­ 인' λŒ€μ²΄ν’ˆμ„ μ œκ³΅ν•˜μ—¬ λ§Žμ€ 호좜 μ‚¬μ΄νŠΈμ— λŒ€ν•œ μ½”λ“œ 변경을 μ΅œμ†Œν™”ν•˜λ©΄μ„œ 속도λ₯Ό ν–₯μƒμ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. 슀트리밍 μ ‘κ·Ό 방식은 기술적으둜 μ μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 10λ°”μ΄νŠΈ 청크둜 λΆ„ν• λœ 슀트림의 ν•΄μ‹œλŠ” 100λ°”μ΄νŠΈ 청크둜 λΆ„ν• λœ μ •ν™•νžˆ λ™μΌν•œ 슀트림의 ν•΄μ‹œμ™€ λ™μΌν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λΆˆμ—°μ† λ¬Έμžμ—΄μ˜ 'ꡬ쑰'λŠ” 관련성이 있으며 ν•΄μ‹œ 결과에 κΈ°μ—¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이것은 μž„μ˜μ˜ μœ„μΉ˜(단 ν•œ μˆ˜μ€€ 깊이)에 ν¬ν•¨λœ λ‹€λ₯Έ λ¬Έμžμ—΄μ— λŒ€ν•œ 'κ°„μ ‘' μ°Έμ‘°κ°€ μžˆλŠ” λ¬Έμžμ—΄μž…λ‹ˆλ‹€. κ°„μ ‘ λ¬Έμžμ—΄κ³Ό κΈ°λ³Έ λ¬Έμžμ—΄μ˜ ν•˜μœ„ 집합을 ν•΄μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€(κ°„μ ‘ λ¬Έμžμ—΄μ— λŒ€ν•œ 포인터 μ œμ™Έ).

λ‚˜λŠ” XXH64λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 64λΉ„νŠΈ ν•˜λ“œμ›¨μ–΄μ—μ„œ 더 λΉ λ₯΄κ³  XXH32보닀 더 λ‚˜μ€ μ„±λŠ₯을 λ³΄μΈλ‹€λŠ” 것을 μ•Œμ•˜λ‹€. 결과의 32λΉ„νŠΈλ₯Ό ν•΄μ‹œλ‘œ μ‚¬μš©ν•œλ‹€.

μ €λŠ” 32λΉ„νŠΈ μˆ˜μ€€μ˜ ν•΄μ‹œ ν’ˆμ§ˆμ— λ§Œμ‘±ν•˜λ―€λ‘œ λ‹€μ–‘ν•œ λ¬Έμžμ—΄μ˜ 32λΉ„νŠΈ ν•΄μ‹œλ₯Ό λ‹€μŒ λ¬Έμžμ—΄μ„ ν†΅ν•©ν•˜λŠ” μ‹œλ“œλ‘œ λ„£λŠ” 것이 ν•©λ¦¬μ μœΌλ‘œ λ³΄μ˜€μŠ΅λ‹ˆλ‹€.

κΈ°μ‘΄ ν”„λ‘œκ·Έλž¨ κ΅¬μ‘°μ—μ„œ ν—ˆμš©ν•˜λŠ” 경우 2개의 연속 ν•΄μ‹œ 사이에 64λΉ„νŠΈλ₯Ό μ „λ‹¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λμ—λ§Œ 32λΉ„νŠΈ μΆ”μΆœμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. ν•΄μ‹œ ν’ˆμ§ˆμ„ μ΅œλŒ€ν™”ν•©λ‹ˆλ‹€.

64λΉ„νŠΈ μ‹œλ“œλ₯Ό ν—ˆμš©ν•˜λ„λ‘ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? ν˜„μž¬ λ‹€μŒ 단계λ₯Ό μ‹œλ“œν•˜κΈ° μœ„ν•΄ ν•˜μœ„ 32λΉ„νŠΈλ₯Ό μΆ”μΆœν•˜λŠ” λŒ€μ‹  μƒμœ„ 32λΉ„νŠΈμ™€ ν•˜μœ„ 32λΉ„νŠΈλ₯Ό ν•¨κ»˜ xor'ν•˜μ—¬ λͺ¨λ“  64λΉ„νŠΈκ°€ 32λΉ„νŠΈ 이월에 'κΈ°μ—¬'ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. λΆˆν–‰νžˆλ„ 데이터λ₯Ό λ³΅μ‚¬ν•˜μ§€ μ•Šκ³  쀑간 64λΉ„νŠΈ 값을 λ‹€μŒ λ¬Έμžμ—΄μ— μΆ”κ°€ν•˜κ±°λ‚˜ μΆ”κ°€ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. ν•΄λ‹Ή μ €μž₯μ†Œλ₯Ό μ œμ–΄ν•  수 μ—†κΈ° λ•Œλ¬Έμ— λ‚˜μ—κ²Œ μ „λ‹¬λ©λ‹ˆλ‹€.

신경쓰지 λ§ˆμ„Έμš”. 이제 XXH64κ°€ 64λΉ„νŠΈ μ‹œλ“œ 값을 ν—ˆμš©ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰