어떻게 눈꽃 알고리즘 을 통 해 Python 으로 간단 한 발신 기 를 실현 합 니까?
snowflake 알고리즘 의 원리 에 따라 간단 한 발신 기 를 실현 하여 중복 되 지 않 고 증가 하 는 id 를 생 성 합 니 다.
1.snowflake 알고리즘 에 대한 간단 한 설명
이곳 의 snowflake 알고리즘 은 이 진 으로 64 비트 입 니 다.그 중에서 41 개의 시간 스탬프 는 현재 시간 스탬프 는 특정한 설정 의 시작 시간 을 빼 고 10 개의 표 지 는 서로 다른 기계,데이터 뱅 크 의 표지 ID 등 이 고 시리 얼 번 호 는 1 초 또는 1 밀리초 안에 증가 하 는 id 라 고 밝 혔 다.
내 가 할 때 비트 연산 으로 실현 하지 않 고 십 진법,16 비트 를 만 들 었 다.그러나 발신 기 를 실현 하 는 기본 전략 은 똑 같 습 니 다.시간 스탬프 와 표 지 를 통 해 중복 을 방지 하고 시리 얼 번 호 를 통 해 자체 증 가 를 실현 합 니 다.물론 중요 한 것 은 발신 기 가 몇 자리 인지 가 아니 라 프로젝트 의 실제 상황 에 따라 snowflake 알고리즘 의 원 리 를 이용 하여 자신의 프로젝트 에 적합 한 발신 기 를 실현 하 는 것 입 니 다.
2.Python 구현
시간 스탬프:9 비트,시작 시간 은 2018-01-01 00:00:00 이 며,시간 스탬프 는 현재 시간 에서 시작 시간 을 뺀 것 입 니 다.타임 스탬프 는 9 이 고 사용 가능 한 시간 은 99999999/(606024*365)개 월 31(년)입 니 다.
표지 ID:2 비트 는 제 가 사용 할 때 비교적 간단 하고 데이터 베이스 와 관련 된 상황 이기 때문에 데이터 시트 로 표지 ID 에 대응 하고 100 장의 표를 사용 할 수 있 습 니 다.
시리 얼 번호:5 자리,내 시간 스탬프 는 초 급 이지 만 5 자 리 는 10 만 개의 시리 얼 번호 로 테스트 를 통 해 1 초 안에 충분히 사용 할 수 있다.
그래서 시간 스탬프,표지 ID,일련 번호 의 자릿수 도 반드시 얼마 가 필요 하 다 고 규정 하지 않 고 자신의 프로젝트 의 실제 상황 에 따라 하면 된다.
코드 는 다음 과 같 습 니 다:
import time
class MySnow:
def __init__(self,dataID):
self.start = int(time.mktime(time.strptime('2018-01-01 00:00:00', "%Y-%m-%d %H:%M:%S")))
self.last = int(time.time())
self.countID = 0
self.dataID = dataID # ID,
def get_id(self):
#
now = int(time.time())
temp = now-self.start
if len(str(temp)) < 9: # 9 0
length = len(str(temp))
s = "0" * (9-length)
temp = s + str(temp)
if now == self.last:
self.countID += 1 # ,
else:
self.countID = 0 # , 0
self.last = now
# ID
if len(str(self.dataID)) < 2:
length = len(str(self.dataID))
s = "0" * (2-length)
self.dataID = s + str(self.dataID)
#
if self.countID == 99999: # 5 ,
time.sleep(1)
countIDdata = str(self.countID)
if len(countIDdata) < 5: # 5 0
length = len(countIDdata)
s = "0"*(5-length)
countIDdata = s + countIDdata
id = str(temp) + str(self.dataID) + countIDdata
return id
사용 방법:
snow = MySnow(dataID="00")
print(snow.get_id())
그 중에서 dataID 는 바로 표지 ID 이 고 countID 는 자체 증가 시퀀스 번호 이다.dataID 는 사용자 정의 맵 을 통 해 얻 을 수 있 습 니 다.이것 은 실제 항목 의 상황 에 따라 결 정 됩 니 다.3.병발 에 관 하여
우선,이 발신 기 를 직접 사용 하면 병행 작업 을 할 수 없고 중복 되 는 id 가 생 길 수 있 습 니 다.만약 정말 병발 을 하려 고 한다 면 병발 과 자리수의 어느 것 이 더 중요 한 지 저울질 해 봐 야 한다.
실제 예 를 들 어 제 가 동시 다발 하 는 목적 은 시간 을 절약 하고 프로그램 이 빨리 끝 날 수 있 도록 하 는 것 입 니 다.이때 동시 다발 을 위해 저 는 dataID 에서 한 명 을 꺼 내 서 서로 다른 하위 프로 세 스 를 표시 하면 중복 되 는 id 가 발생 하 는 것 을 방지 할 수 있 습 니 다.그러나 실제 적 으로 이것 은 자릿수 로 시간 을 바 꾸 었 습 니 다.만약 에 id 자릿수 가 비교적 적은 경우,예 를 들 어 16 비트 의 경우 dataID 가 비교적 적 습 니 다.저 는 개인 적 으로 이렇게 하 는 것 이 가치 가 없고 사 치 스 럽 다 고 생각 합 니 다.이 럴 때 는 병발 보다 자릿수 가 중요 하 다.
당시 에 만약 자리수 가 충분 하 다 면,예 를 들 어 20 명의 사람 이 병발 해 야 한다 면 병발 해 야 한다.
또 하나의 병발 을 실현 하 는 방법 은 바로 호출기 에 자 물 쇠 를 채 우 고 호출기 에 자 물 쇠 를 채 우 며 자 물 쇠 를 풀 었 다 는 것 이다.이 건 해 본 적 이 없어 요.관심 있 으 면 해 보 세 요.하하.그런데 저 는 궁금 한 게 있 습 니 다.바로 자물쇠 와 잠 금 해제 전환 을 계속 하면 시간 과 자원 비용 이 많이 들 지 않 을 까 하 는 것 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.