python 实现Twitter的分布式雪花算法

import socket
import time


class IdWorker(object):
    # 获取主机名
    HOSTNAME = socket.gethostname()
    # 获取IP
    IP = socket.gethostbyname(HOSTNAME)
    # 序列号(12位  0-4095)
    SERIAL_NUMBER = 0
    # 时间戳(41位)
    TIMESTAMP = int(time.time() * 1000)
    # 机器id(10位  0-1024)  这里取机器ip最后8位
    MACHINE_ID = int(IP.split('.')[3])

    @classmethod
    def generate(cls):
        now = int(time.time() * 1e3)
        if now == cls.TIMESTAMP:
            cls.SERIAL_NUMBER += 1
        else:
            cls.TIMESTAMP = now
            cls.SERIAL_NUMBER = 0
        return (cls.TIMESTAMP << 22) + (cls.MACHINE_ID << 12) + cls.SERIAL_NUMBER


if __name__ == '__main__':
    import random

    for i in range(100):
        time.sleep(random.random())
        _id = IdWorker.generate()
        print(_id)

附:IP地址和整型互相转换

IP = '192.168.1.117'
IP_number = sum(int(j) << i * 8 for i, j in enumerate(IP.split('.')[::-1]))
print(IP_number)
IP_addr = '.'.join([str((IP_number // 256 ** i) % 256) for i in range(3, -1, -1)])
print(IP_addr )

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值