php sha256 获取 Java sha256 数据
public String toBase58() {
byte[] data = new byte[25];
data[0] = COIN_VERSION;
System.arraycopy(toArray(), 0, data, 1, 20);
byte[] checksum = Digest.sha256(Digest.sha256(data, 0, 21));
System.arraycopy(checksum, 0, data, 21, 4);
return Base58.encode(data);
}
上面可以看到 java toBase58 方法是凉了两次 sha256
对应PHP连续两次sha256 如果想和java 实现的一样就需要 hex2bin(hash('sha256', hex2bin(hash('sha256', hex2bin($hexstr))) 每次sha256前 都需要先 二进制 hex2bin
查了很多问题, 给出的都不理想, java sha256 对比 php sha256 存在问题. 下面还有php转 base58 的方法
php base58 加密方法
$string = hex2bin($$hexstr).substr(hex2bin(hash('sha256', hex2bin(hash('sha256', hex2bin($hexstr))))), 0, 4)
base58_encode(string);
/**
* base58 encode
* @param $string
* @return bool|string
*/
public static function base58_encode($string)
{
$alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
$base = strlen($alphabet);
if (is_string($string) === false) {
return false;
}
if (strlen($string) === 0) {
return '';
}
$bytes = array_values(unpack('C*', $string));
$decimal = $bytes[0];
for ($i = 1, $l = count($bytes); $i < $l; $i++) {
$decimal = bcmul($decimal, 256);
$decimal = bcadd($decimal, $bytes[$i]);
}
$output = '';
while ($decimal >= $base) {
$div = bcdiv($decimal, $base, 0);
$mod = bcmod($decimal, $base);
$output .= $alphabet[$mod];
$decimal = $div;
}
if ($decimal > 0) {
$output .= $alphabet[$decimal];
}
$output = strrev($output);
foreach ($bytes as $byte) {
if ($byte === 0) {
$output = $alphabet[0] . $output;
continue;
}
break;
}
return (string) $output;
}
PHP 过滤表单输入的 emoji 表情
1.过滤emoji表情的原因
在我们的项目开发中,emoji 表情是个麻烦的东西,即使我们可以能存储,也不一定能完美显示,因为它的更新速度很快:在iOS以外的平台上,例如PC或者android。如果你需要显示emoji,就得准备一大堆emoji图片并使用第三方前端类库才行。即便如此,还是可能因为emoji图片不够全而出现无法显示的情况
在大多数业务场景下,emoji也不是非要不可的。我们可以适当地考虑干掉它,节约各种成本。
2.php过滤emoji原理
Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是字符)是一套起源于日本的12x12像素表情符号,由栗田穣崇(Shigetaka Kurit)创作,最早在日本网络及手机用户中流行。自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。近期,更是有不少网友用emoji图案玩猜字游戏,享受这种表情文化带来的乐趣。
关于emoji的发音:很多人第一眼见到emoji便会下意识将其误读作“一磨叽”,其实不然,emoji音译过来大概读作“诶磨叽”,当中“e”的发音颇似字母abc的a的发音。
最初日本的三大电信运营商各自有不同的字符定义,分别是DoCoMo、KDDI和Softbank。随着iOS内置了Softbank的版本,emoji在全球范围内风靡(iOS5版本以前)。而Google又自己定义了一套emoji字符。iOS5以后,apple采用了unicode定义的emoji字符(iOS5版本以后)。
unicode定义的emoji是四个字符,softbank为3个字符,emoji的四个字符从存储到展示对应没有做过考虑的系统来说,简直就是灾难。
3.针对unicode定义的emoji表情过滤
①.unicode定义的emoji是四个字符,根据这个原理进行过滤
// 过滤掉emoji表情
function filter_Emoji($str)
{
$str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换
'/./u',
function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
},
$str);
return $str;
}
②. unicode emoji是4个字节,softbank定义的emoji占用3个字节存储,通过emoji for php ,我们可以把unicode的emoji方式转换为softbank方式,从而实现不修改数据库,就能存储emoji,相对于数据库层面的解决问题的方式,动作要小的多,并且也不会有性能,运维等方面的问题。但是有个不可避免的问题是,Softbank方式已经不再维护,所以新增加的emoji表情,Softbank中都没有,会造成部分emoji表情丢失的情况,对于这种情况不推荐使用。
后续还有一些方法没有亲自实践过,但是给大家提供出来。
1、使用utf8mb4字符集
如果你的mysql版本>=5.5.3,你可以尝试直接将utf8直接升级为utf8mb4字符集
这种4字节的utf8编码可完美兼容旧的3字节utf8字符集,并且可以直接存储emoji表情,是较好的解决方案之一。
至于字节增大带来的性能损耗,根据自己的项目,自己估算吧....
2、使用base64编码
如果你因为某些原因无法使用utf8mb4字符集的话,你还可以使用base64来曲线救国
使用例如base64_encode之类的函数编码过后的emoji可以直接存储在utf8字节集的数据表中,取出时decode一下即可
APISIX: 国产微服务网关
APISIX: 国产微服务网关
APISIX是一个基于OpenResty和etcd构建的国产微服务API网关。它具有高性能、可扩展性和丰富的功能,可以帮助开发者构建强大的微服务架构。本文将介绍APISIX的概述、安装步骤以及控制台的使用。
概述
APISIX是一个云原生的微服务API网关,它基于OpenResty和etcd实现。OpenResty是一个可伸缩的Web平台,通过Lua扩展了Nginx的功能。etcd是一个键值存储系统。APISIX利用插件机制,提供了动态负载均衡、身份验证、限流限速等功能,并支持开发者自定义插件进行拓展。
APISIX的特点包括:
- 动态负载均衡:支持跨多个上游服务的动态负载均衡,目前已支持轮询和一致性哈希算法。
- 身份验证:支持多种认证方式,如key-auth、JWT、basic-auth和wolf-rbac等。
- 限流限速:可以基于速率、请求数和并发数等维度进行限制。
- 高级功能:支持A/B测试、金丝雀发布、蓝绿部署、监控报警、服务可观测性和服务治理等。
APISIX的文档非常齐全,由于是国人开源,所以文档也非常中文友好。开发者可以通过以下文档了解更多:
快速安装
在安装APISIX之前,需要安装OpenResty和etcd。以下是在CentOS 7.x系统上安装APISIX的步骤:
- 安装OpenResty:
# 安装OpenResty的YUM软件源
$ yum install yum-utils
$ yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
# 安装OpenResty软件
$ yum install -y openresty
- 安装etcd:
# 安装etcd
$ yum install -y etcd
# 启动etcd
$ service etcd start
- 安装APISIX:
# 安装APISIX
$ yum install -y https://github.com/apache/incubator-apisix/releases/download/1.2/apisix-1.2-0.el7.noarch.rpm
# 启动APISIX
$ apisix start
安装完成后,APISIX将安装在/usr/local/apisix/目录下。
APISIX控制台
APISIX内置了一个控制台,方便开发者查看和维护APISIX的路由、消费者、服务、SSL和上游服务等。控制台的访问路径默认为/apisix/dashboard。
如果APISIX安装在本机上,可以直接通过浏览器访问http://127.0.0.1:9080/apisix/dashboard来进入控制台。如果需要远程访问控制台,需要修改配置文件/usr/local/apisix/conf/config.yaml中的admin_api_network配置项,将其设置为可访问的网络地址。
控制台提供了以下功能:
- 路由管理:可以配置API路由规则,包括请求方法、请求路径、上游服务等。
- 消费者管理:可以配置API的消费者信息,如认证方式和访问限制。
- 服务管理:可以管理后端的上游服务,包括负载均衡方式和健康检查等。
- SSL管理:可以配置SSL证书,用于加密API的通信。
- 插件管理:可以启用和配置不同的插件,如限流插件和缓存插件。
- 网关状态:可以查看APISIX的运行状态和监控信息。
通过控制台,开发者可以方便地管理和监控APISIX的各个组件,确保微服务架构的稳定运行。
总结
APISIX是一个国产的微服务API网关,它基于OpenResty和etcd实现,并提供了丰富的功能和插件机制。通过APISIX,开发者可以快速构建高性能、可扩展的微服务架构,并使用控制台进行管理和监控。如果你想了解更多关于APISIX的信息,可以参考以下文档:
希望本文能给你带来对APISIX的初步了解和使用指导。如有任何疑问或问题,请留言咨询。感谢阅读!
参考文献
Python 定时器
Python 定时器
在Python开发中,经常需要执行定时任务。Python提供了多种方式来实现定时器功能,使我们能够按照指定的时间间隔执行代码。本文将介绍如何在Python中使用定时器。
使用 time 模块
Python的time模块提供了一些用于处理时间的函数和类,其中包含了定时器的功能。下面是一个使用time模块实现简单定时器的示例代码:
import time
def task():
print("定时任务执行")
# 设置定时器,每隔5秒执行一次任务
while True:
task()
time.sleep(5)
在上述示例中,我们定义了一个名为task的函数,用于执行定时任务。通过使用time.sleep(5)函数,我们实现了每隔5秒执行一次任务的定时器功能。
使用 sched 模块
Python的sched模块是一个基于事件驱动的定时调度器,提供了更高级的定时器功能。下面是一个使用sched模块实现定时器的示例代码:
import sched
import time
def task():
print("定时任务执行")
# 创建调度器对象
scheduler = sched.scheduler(time.time, time.sleep)
# 设置定时器,每隔5秒执行一次任务
def run_task():
task()
scheduler.enter(5, 1, run_task, ())
scheduler.enter(0, 1, run_task, ())
scheduler.run()
在上述示例中,我们使用sched模块创建了一个调度器对象scheduler。通过scheduler.enter(5, 1, run_task, ())方法,我们实现了每隔5秒执行一次任务的定时器功能。
注意事项
在使用定时器时,需要注意以下几点:
- 时间间隔:根据实际需求,设置合适的时间间隔。过短的时间间隔可能会导致频繁执行任务,过长的时间间隔可能会延迟任务的执行。
- 任务的耗时:在任务执行时间较长的情况下,需要确保任务的执行时间不会超过下一次定时器触发的时间间隔,以避免任务重叠。
- 异常处理:在任务执行过程中,应考虑异常情况的处理,确保程序的稳定性和可靠性。
参考文献
以下是一些相关的参考文献,供进一步学习和了解:
- Python官方文档:time
- Python官方文档:sched
- Real Python教程:Python Timer Functions: Three Ways to Monitor Your Code
结论
通过使用Python提供的time模块或sched模块,我们可以方便地实现定时器功能,按照指定的时间间隔执行代码。合理使用定时器可以提高程序的效率和灵活性。
参考文章:Python 定时器
Beyond Compare for Mac 无限试用方法
Beyond Compare for Mac 无限试用方法
原理:
删除注册文件即可永久保持30天免费
- 在官网下载最新的 Beyond Compare
- 把 Beyond Compare 复制到应用程序中.
- 显示隐藏文件
MAC中显示隐藏文件有很多种方法,最简单的是通过在Mac终端输入命令。
显示隐藏文件(注意空格和大小写):
defaults write com.apple.finder AppleShowAllFiles -bool true
或
defaults write com.apple.finder AppleShowAllFiles YES
电脑磁盘->用户->用户名->资源库(隐藏文件夹)->Application Support->Beyond Compare->registry.dat
或者
电脑磁盘->资源库->Application Support->Beyond Compare->registry.dat
- 选中图标,右键点击“显示包内容”,逐步进入 Beyond Compare 应用程序的 MacOS 目录下(/Applications/Beyond Compare.app/Contents/MacOS)
- 将主启动程序 BCompare 重命名为 BCompare.real
- 在同级目录下新建一个脚本文件,命名为 BCompare,这样 BCompare 在启动的时候就会执行该脚本文件
#!/bin/bash
# 修改删除路径为你确认的路径
rm "/Users/admin/Library/Application Support/Beyond Compare/registry.dat"
"`dirname "$0"`"/BCompare.real $@
- 使用 Mac 自带的文本编辑器,将脚本内容录入保存为 rtf
然后选中文件,Command + i 会显示简介,去掉 .rtf 扩张名或者先改成 .sh
- 然后双击打开文件编辑,将 rtf 格式的相关内容去掉,只保留上文提到的脚本代码,保存,如果有 .sh 扩展名就去掉
- 最后在终端使用 cd 命令进入 MacOS 目录,执行 chmod a+x BCompare。
cd /Applications/Beyond Compare.app/Contents/MacOS/
chmod a+x BCompare - 完成后关闭就好了,然后你就可以无限试用了!