눈송이 알고리즘은 트위터의 분산 고유 ID 생성 알고리즘 오픈 소스입니다. 분산 시스템에서 고유 한 ID를 생성하는 문제를 해결하도록 설계되었습니다. 이 알고리즘은 64 비트 정수를 ID로, 타임 스탬프, 머신 ID 및 자체 확정 시퀀스 부분을 포함합니다. 이 기사는 PHP 코드 예제를 사용 하여이 알고리즘을 구현하여 분산 고유 ID를 생성하는 방법을 보여줍니다.
눈송이 알고리즘의 64 비트 ID는 다음 부분으로 구성됩니다.
타임 스탬프 부품은 42 비트를 차지하며, 표현할 수있는 시간 범위는 2010 년 1 월 1 일부터 2039 년 9 월 7 일까지 밀리 초의 정확도가 있습니다.
기계 ID 부분은 10 비트를 차지하며 최대 1024 대의 기계를 지원합니다.
자체 증가 시퀀스 부분은 12 비트를 차지하며 최대 4096 ID가 밀리 초당 생성됩니다.
다음은 분산 고유 ID를 생성하기 위해 눈송이 알고리즘을 구현하는 PHP 샘플 코드입니다.
class Snowflake {
private $machineId; // 기계ID
private $epoch = 1288834974657; // 초기 타임 스탬프,타임 스탬프 부품의 값을 계산하는 데 사용됩니다
private $sequence = 0; // 일련 번호 부분
// 건설자
public function __construct($machineId) {
$this->machineId = $machineId;
}
// 고유 한 생성ID
public function generateId() {
$timestamp = $this->getTimestamp();
$snowflakeId = (($timestamp - $this->epoch) << 22) | ($this->machineId << 12) | $this->sequence;
return $snowflakeId;
}
// 현재 타임 스탬프를 얻으십시오,밀리 초
private function getTimestamp() {
return floor(microtime(true) * 1000);
}
}
// 예제 사용
$snowflake = new Snowflake(1); // 传入기계ID
$id = $snowflake->generateId();
echo $id;
위의 코드에서는 Snowflake라는 클래스를 정의합니다. 생성자는 기계 ID를 매개 변수로 가져 와서 클래스의 개인 변수에 저장합니다. GenerateId () 메소드는 고유 ID를 생성하는 핵심 부분입니다. 먼저 현재 타임 스탬프를 얻은 다음 타임 스탬프, 기계 ID 및 시퀀스 번호를 눈송이 알고리즘의 구조에 따라 고유 ID로 결합합니다. gettimestamp () 메소드는 현재 타임 스탬프를 가져 오는 데 사용됩니다 (밀리 초). 예제 사용에서는 기계 ID 1으로 눈송이 객체를 인스턴스화하고 generateId () 메소드를 호출하여 고유 ID를 생성하고 결과를 인쇄합니다.
이 기사는 PHP를 사용하여 눈송이 알고리즘을 구현하여 분산 고유 ID를 생성하는 방법에 대해 자세히 설명합니다. 이러한 방식으로 생성 된 ID는 고유성과 확장 성이 높으며 분산 시스템의 다양한 시나리오에 적합합니다. 눈송이 알고리즘의 핵심 아이디어는 타임 스탬프, 머신 ID 및 일련 번호를 사용하여 ID를 생성하여 각 생성 된 ID가 고유하고 효율성이 높은지 확인하는 것입니다.