PHP에서 Hash_copy 함수는 해시 컨텍스트 ( HashContext )를 복사하는 데 사용되므로 원래 컨텍스트 상태를 변경하지 않고 동일한 상태의 해시 컴퓨팅 인스턴스를 생성 할 수 있습니다. 멀티 스레드 환경에서 해싱 작업의 경우 보안 및 효율성이 개발자의 관심의 핵심 사항입니다. 이 기사는 다중 스레드 환경에서 Hash_copy 기능의 보안과 모범 사례가 어떻게 수행되는지 자세히 살펴볼 것입니다.
Hash_copy는 HASH 컴퓨팅 컨텍스트를 복사하기 위해 PHP 5.3.0에 도입 된 함수입니다.
<?php
$ctx1 = hash_init('sha256');
hash_update($ctx1, 'hello');
$ctx2 = hash_copy($ctx1);
hash_update($ctx2, ' world');
echo hash_final($ctx1); // hello 해시 가치
echo "\n";
echo hash_final($ctx2); // hello world 해시 가치
?>
Hash_copy는 기존 해시 데이터를 반복적으로 계산하지 않고 컨텍스트를 복사하여 성능을 향상시킬 수 있습니다.
PHP는 다중 스레드 환경에 고유하지 않지만 PTHREADS 또는 SWOOLE와 같은 확장을 통해 다중 스레딩을 달성 할 수 있습니다. 이 시점에서 여러 스레드가 동시에 동일한 해시 컨텍스트 리소스에 액세스 할 수 있습니다.
Hash_copy 자체는 메모리에 상태 객체를 복사합니다. 여러 스레드가 동시에 동일한 컨텍스트 변수를 공유하고 잠그지 않으면 읽기 및 쓰기 충돌이 발생하여 데이터 레이스 조건이 발생하여 예측할 수없는 해시 결과를 생성합니다.
그러나 각 스레드가 독립적으로 해시 텍스트 사본을 보유하거나 복사 후 독립적으로 작동하는 경우 스레드 안전 문제는 발생하지 않습니다.
PHP 해시 확장은 기본 C 언어 구현 (OpenSSL 또는 내장 해시 라이브러리)을 기반으로합니다. 일반적으로 이러한 라이브러리는 스레드 안전 자체이지만 다음에주의를 기울여야합니다.
PHP 또는 해시 확장의 다른 버전마다 스레드 안전 보장이 다릅니다.
사용자 모드 공유 변수는 뮤트 또는 기타 동기화 메커니즘을 통해 자체적으로 보호되어야합니다.
Hash_copy 함수 자체는 안전하지만 여러 스레드가 여러 스레드가없는 경우에만 동일한 해시 컨텍스트 인스턴스를 동시에 작동합니다 . 복사 된 컨텍스트는 각 스레드에서 독립적으로 사용할 수 있습니다.
다중 스레드 환경에서 해시 복제가 안전하고 효율적인지 확인하려면 다음과 같은 관행이 권장됩니다.
해시 컨텍스트를 초기화 한 후 Hash_copy를 통해 복사하여 각 스레드에 전달하여 경쟁을 피하기 위해 혼자 사용하십시오.
<?php
$ctx = hash_init('sha256');
hash_update($ctx, 'common part data');
$threads = [];
for ($i = 0; $i < 5; $i++) {
$threadCtx = hash_copy($ctx); // 각 스레드는 독립적 인 사본을 얻습니다
// 여기, 스레드를 만들어 전달합시다$threadCtx
// 스레드 내에서 계속하십시오 hash_update 그리고 마지막으로 hash_final
}
?>
여러 스레드가 동일한 컨텍스트를 업데이트 해야하는 경우 Mutex 보호를 사용해야합니다.
<?php
$mutex = new Mutex();
function safe_hash_update($ctx, $data, $mutex) {
$mutex->lock();
hash_update($ctx, $data);
$mutex->unlock();
}
?>
그러나 빈번한 잠금 작업은 성능에 영향을 미치며 권장되지 않습니다.
모호하지 않은 해시 컨텍스트 포인터를 통과하면 인종 문제가 직접 발생합니다. 새 사본은 항상 hash_copy 로 생성되어야합니다.
환경에서 허용되면 컨텍스트 상태 공유로 인한 복잡성을 피하기 위해 계산을 위해 Sationeless Hash 함수 (예 : HASH ( 'SHA256', $ Data) )를 직접 사용할 수 있습니다.
HASH_COPY 기능 자체는 안전하며 다중 스레드 안전 위험을 도입하지 않습니다.
다중 스레드 환경에서 키는 여러 스레드가 동일한 해시 텍스트 인스턴스를 공유하고 작동하지 않는 것입니다.
모범 사례는 다음과 같습니다. 컨텍스트를 복사 한 후에는 독립적 인 사용을 위해 각 스레드에 양도되거나 잠금 메커니즘을 통해 공유 컨텍스트를 보호합니다.
가능하면 Multithreading을 단순화하기 위해 Sationeless Hash 인터페이스를 사용하십시오.