专栏首页大猪的笔记python笔记:随机数,md5,en/decoder

python笔记:随机数,md5,en/decoder

uuid 生成随机识别号

import uuid

for i in range(0,10):
    print "uuid is :"+ str(uuid.uuid4())

另一种实现

import os
import base64

def GetRndStr():    
    rndByte = os.urandom(6)
    b64Str = base64.urlsafe_b64encode(rndByte)
    return b64Str

生成不重复随机序列

import random

def get_rnd(max_size, counts):
    basearr = [x for x in range(max_size)]
    result = []

    max_position = max_size - 1
    while counts and max_position:
        rnd_position = random.randint(0, max_position)
        result.append(basearr[rnd_position])
        basearr[rnd_position] = basearr[max_position]
        max_position -= 1
        counts -= 1
    return result

for i in range(10):
    print(get_rnd(1000, 50))

生成snowflake流水号

import datetime
import math
import threading
import time
import uuid

from random import SystemRandom

cryptogen = SystemRandom()


# 0位 时间 机器码 random 流水号
# 0 - 0 * 41 - 0 * 10 - 0 * 8 - 0 * 4

class SnowFlake(object):
    def __init__(self):
        self._INIT_TIME = 1420041600000  # 2015-01-01
        self._last_timestamp = 0
        self._WORKER_ID_LEN = 10
        self._RAM_LEN = 8
        self._FLOW_LEN = 22 - self._WORKER_ID_LEN - self._RAM_LEN
        self._flow = 0
        self._FLOW_MAX = int(math.pow(2, self._FLOW_LEN))
        self._lock = threading.Lock()
        self._worker_id = None
        self._ram = None

    def _get_worker_id(self):
        if not self._worker_id:
            self._worker_id = uuid.getnode() % \
                              int(math.pow(2, self._WORKER_ID_LEN))
        return self._worker_id

    def _generate_ram(self):
        self._ram = (self._ram + 1) % \
                    int(math.pow(2, self._WORKER_ID_LEN))

    def _get_ram(self):
        if not self._ram:
            self._ram = cryptogen.randrange(0, 100000) % \
                        int(math.pow(2, self._RAM_LEN))
        return self._ram

    def generate(self):
        self._lock.acquire(1)
        tp = int(time.time() * 1000)
        tp = tp - self._INIT_TIME

        if tp < self._last_timestamp:
            # 处理时间回拔,重新生成ram
            self._generate_ram()

        if tp == self._last_timestamp:
            self._flow += 1
            if self._flow > self._FLOW_MAX:
                raise Exception("flow no overflowed!")
        else:
            self._last_timestamp = tp
            self._flow = 1

        ret = 0

        ret += tp << (self._WORKER_ID_LEN + self._RAM_LEN + self._FLOW_LEN)
        ret += self._get_worker_id() << (self._RAM_LEN + self._FLOW_LEN)
        ret += self._get_ram() << self._FLOW_LEN
        ret += self._flow

        self._lock.release()
        return ret

    def get_time(self, flow_no):
        flow_tp = flow_no >> (self._WORKER_ID_LEN + self._RAM_LEN + self._FLOW_LEN)
        utc_tp = flow_tp + self._INIT_TIME

        dt = datetime.datetime.fromtimestamp(utc_tp / 1000)
        return dt

    def get_worker_id(self, flow_no):
        worker_id = flow_no >> self._FLOW_LEN + self._RAM_LEN
        worker_id = worker_id & ((1 << self._WORKER_ID_LEN) - 1)
        return worker_id

    def get_ram(self, flow_no):
        ram = flow_no >> self._FLOW_LEN
        ram = ram & ((1 << self._RAM_LEN) - 1)
        return ram

if __name__ == '__main__':
    snowflake = SnowFlake()
    for i in range(10):
        flow_no = snowflake.generate()
        bit_flow_no = '{:064b}'.format(flow_no)
        dt = snowflake.get_time(flow_no)
        worker_id = snowflake.get_worker_id(flow_no)
        ram = snowflake.get_ram(flow_no)
        # print(flow_no)
        print("{} \n{} \n{} "
              "\n{} \n{}".format(flow_no, bit_flow_no, dt, worker_id, ram))

加权随机数

import random

# 加权随机数
def rnd_power(power_ranks: [int]) -> int:
    """
    传入权重,随机返回该权重的index
    :param power_ranks: [10,20,30,40]
    :return: index of power_rank
    """
    sum_ranks = sum(power_ranks)
    rnd = random.randint(0, sum_ranks - 1)
    all_rank = 0
    for i, rank in enumerate(power_ranks):
        all_rank += rank
        if rnd < all_rank:
            return i

if __name__ == '__main__':
    result = [0, 0, 0, 0]
    for i in range(10000):
        index = rnd_power([10, 20, 30, 40])
        result[index] += 1
    print(result) # [1000, 2025, 2973, 4002]

2 md5加密

import hashlib

md5obj = hashlib.md5()
md5obj.update("hello")
md5obj.update("world")

print md5obj.hexdigest()

#md5文件
def CalcMD5(filepath):
    with open(filepath,'rb') as f:
        md5obj = hashlib.md5()
        md5obj.update(f.read())
        hash = md5obj.hexdigest()
        return hash

3 url的编码和解码

import urllib
import urlparse

data = {
    'name':'尹子豪',
    'id':'346093'
    }
#返回的是string类型的url
data = urllib.urlencode(data) #比较坑,有urlencode没有urldecode。。
print data

data = urlparse.urlparse("www.yinzihao.com.cn/index?"+data) #凑个网址,使用parse拆分
print data

params=urlparse.parse_qs(data.query,True) #拆分url参数,自动urldecode了,大家不用担心。
print params
myname = params['name'][0] #此时可以打印名称了
print myname.decode('utf-8').encode('gbk') #输出的时候使用系统的gbk编码,否则乱码。

py3可以这样

from urllib import parse

test = "大猪"
test = parse.quote(test)
print(test)
test = parse.unquote(test)
print(test)

4 htmlencoder和decoder

import HTMLParser
import cgi

def decodeHtml(input):
    h = HTMLParser.HTMLParser()
    s = h.unescape(input)
    return s

def encodeHtml(input):
    s = cgi.escape(input)
    return s

py3

from html import escape, unescape

strs = "<span>&#62;</span>"
strs = escape(strs)
print(strs)
strs = unescape(strs)
print(strs)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • 远程办公经验为0,如何将日常工作平滑过度到线上?

    我是一名创业者,我的公司(深圳市友浩达科技有限公司)在2018年8月8日开始运营,现在还属于微型公司。这个春节假期,我一直十分关注疫情动向,也非常关心其对公司带来的影响。

    TVP官方团队
    TAPD 敏捷项目管理腾讯乐享企业邮箱企业编程算法
  • 数据中台,概念炒作还是另有奇效? | TVP思享

    作者简介:史凯,花名凯哥,腾讯云最具价值专家TVP,ThoughtWorks数据智能业务总经理。投身于企业数字化转型工作近20年。2000年初,在IBM 研发企业级中间件,接着加入埃森哲,为大型企业提供信息化架构规划,设计,ERP,云平台,数据仓库构建等技术咨询实施服务,随后在EMC负责企业应用转型业务,为企业提供云迁移,应用现代化服务。现在专注于企业智能化转型领域,是数据驱动的数字化转型的行业布道者,数据中台的推广者,精益数据创新体系的创始人,2019年荣获全球Data IQ 100人的数据赋能者称号,创业邦卓越生态聚合赋能官TOP 5。2019年度数字化转型专家奖。打造了行业第一个数据创新的数字化转型卡牌和工作坊。创建了精益数据创新方法论体系构建数据驱动的智能企业,并在多个企业验证成功,正在向国内外推广。

    TVP官方团队
    大数据数据分析企业
  • 扩展 Kubernetes 之 CRI

    使用 cri-containerd 的调用流程更为简洁, 省去了上面的调用流程的 1,2 两步

    王磊-AI基础
    Kubernetes
  • 扩展 Kubernetes 之 Kubectl Plugin

    kubectl 功能非常强大, 常见的命令使用方式可以参考 kubectl --help,或者这篇文章

    王磊-AI基础
    Kubernetes
  • 多种登录方式定量性能测试方案

    最近接到到一个测试任务,某服务提供了两种登录方式:1、账号密码登录;2、手机号+验证码登录。要对这两种登录按照一定的比例进行压测。

    八音弦
    测试服务 WeTest
  • 线程安全类在性能测试中应用

    首先验证接口参数签名是否正确,然后加锁去判断订单信息和状态,处理用户增添VIP时间事务,成功之后释放锁。锁是针对用户和订单的分布式锁,使用方案是用的redis。

    八音弦
    安全编程算法
  • 使用CDN(jsdelivr) 优化博客访问速度

    PS: 此篇文章适用于 使用 Github pages 或者 coding pages 的朋友,其他博客也类似.

    IFONLY@CUIT
    CDNGitGitHub开源
  • 扩展 Kubernetes 之 CNI

    Network Configuration 是 CNI 输入参数中最重要当部分, 可以存储在磁盘上

    王磊-AI基础
    Kubernetes
  • 聚焦【技术应变力】云加社区沙龙online重磅上线!

    云加社区结合特殊时期热点,挑选备受关注的音视频流量暴增、线下业务快速转线上、紧急上线防疫IoT应用等话题,邀请众多业界专家,为大家提供连续十一天的干货分享。从视野、预判、应对等多角度,帮助大家全面提升「技术应变力」!

    腾小云
  • 京东购物小程序购物车性能优化实践

    它是小程序开发工具内置的一个可视化监控工具,能够在 OS 级别上实时记录系统资源的使用情况。

    WecTeam
    渲染JavaScripthttps网络安全缓存

扫码关注云+社区

领取腾讯云代金券