어떻게 눈꽃 알고리즘 을 통 해 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 명의 사람 이 병발 해 야 한다 면 병발 해 야 한다.
또 하나의 병발 을 실현 하 는 방법 은 바로 호출기 에 자 물 쇠 를 채 우 고 호출기 에 자 물 쇠 를 채 우 며 자 물 쇠 를 풀 었 다 는 것 이다.이 건 해 본 적 이 없어 요.관심 있 으 면 해 보 세 요.하하.그런데 저 는 궁금 한 게 있 습 니 다.바로 자물쇠 와 잠 금 해제 전환 을 계속 하면 시간 과 자원 비용 이 많이 들 지 않 을 까 하 는 것 입 니 다.

좋은 웹페이지 즐겨찾기