package .com796;
import ;
import ;
import ;
import ;
/**
* 1. hmac_sha1编码结果需要转换成hex格式
*
* 2. java中base64的实现和php不一致,其中java并不会在字符串末尾填补=号以把字节数补充为8的整数
*
* 3. hmac_sha1并非sha1, hmac_sha1是需要共享密钥的
*
* @author LEI
*
*/
public class HMACSHA1 {
private static final String HMAC_SHA1 = "HmacSHA1";
/**
* 生成签名数据_HmacSHA1加密
*
* @param data
* 待加密的数据
* @param key
* 加密使用的key
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
*/
public static String getSignature(String data, String key) throws Exception {
byte[] keyBytes = ();
// 根据给定的字节数组构造一个密钥。
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1);
Mac mac = (HMAC_SHA1);
(signingKey);
byte[] rawHmac = (());
String hexBytes = byte2hex(rawHmac);
return hexBytes;
}
private static String byte2hex(final byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < ; n++) {
// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
stmp = ((b[n] & 0xFF));
if (() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs;
}
// /**
// * @param args
// */
// public static void main(String[] args) {
// try {
// (("abc", "abc"));
// } catch (Exception e) {
// ();
// }
// }
}
相关文章
- 使用JAVA实现PHP中hash_hmac 函数
- PySpark安装及WordCount实现(基于Ubuntu)-安装Java: PySpark需要Java运行环境。你可以使用以下命令安装OpenJDK: sudo apt update sudo apt install default-jre default-jdk 安装Scala: PySpark还需要Scala,可以使用以下命令安装: sudo apt install scala 安装Python: 如果你的系统没有Python,可以安装Python 3: sudo apt install python3 安装Apache Spark: 下载并解压Apache Spark。你可以在Apache Spark官网下载最新版本的Spark。 wget https://downloads.apache.org/spark/spark-x.y.z/spark-x.y.z-bin-hadoopx.y.tgz tar -xzvf spark-x.y.z-bin-hadoopx.y.tgz 将 spark-x.y.z-bin-hadoopx.y替换为你下载的实际版本。 设置环境变量: 在 .bashrc或 .zshrc文件中设置Spark和PySpark的环境变量: export SPARK_HOME=/path/to/spark-x.y.z-bin-hadoopx.y export PATH=$PATH:$SPARK_HOME/bin export PYSPARK_PYTHON=python3 记得使用实际的Spark路径。 安装PySpark: 使用pip安装PySpark: pip install pyspark 实现WordCount:
- C#委托(delegate)的常用方式- 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c); public delegate string SayHello(string c);:定义了一个公共委托类型 SayHello,该委托接受一个 string 类型的参数 c,并返回一个 string 类型的值。 Main 方法 static void Main(string args) { // 本质上其实就是把方法当作委托的参数 SayHello sayC = new SayHello(SayChinese); Console.WriteLine(sayC("欢迎大家")); SayHello sayE = new SayHello(SayEgnlish); Console.WriteLine(sayE("Welcome to")); // 简单的写法:必须类型一样 SayHello s1 = SayChinese; SayHello s2 = SayEgnlish; Console.WriteLine(s1("好好好")); Console.WriteLine(s2("Gooood")); // 最推荐 SayHello ss1 = con => con; Console.WriteLine(ss1("niiiice")); // 匿名委托:一次性委托 SayHello ss3 = delegate(string s) { return s; }; Console.WriteLine(ss3("说中国话")); } 常规实例化委托 SayHello sayC = new SayHello(SayChinese);:创建了一个 SayHello 委托的实例 sayC,并将 SayChinese 方法作为参数传递给委托的构造函数。 Console.WriteLine(sayC("欢迎大家"));:通过委托实例调用 SayChinese 方法,并输出结果。 同理,SayHello sayE = new SayHello(SayEgnlish); 和 Console.WriteLine(sayE("Welcome to")); 是对 SayEgnlish 方法的委托调用。 简化的委托赋值方式 SayHello s1 = SayChinese; 和 SayHello s2 = SayEgnlish;:当委托类型和方法签名一致时,可以直接将方法赋值给委托变量,无需使用 new 关键字。 Console.WriteLine(s1("好好好")); 和 Console.WriteLine(s2("Gooood"));:通过委托实例调用相应的方法。 使用 Lambda 表达式实例化委托 SayHello ss1 = con => con;:使用 Lambda 表达式创建委托实例 ss1,con => con 表示接受一个参数 con 并返回该参数本身。 Console.WriteLine(ss1("niiiice"));:通过委托实例调用 Lambda 表达式。 匿名委托 SayHello ss3 = delegate(string s) { return s; };:使用匿名委托创建委托实例 ss3,delegate(string s) { return s; } 是一个匿名方法,直接在委托实例化时定义了方法体。 Console.WriteLine(ss3("说中国话"));:通过委托实例调用匿名方法。 委托引用的方法定义 public static string SayChinese(string content) { return content; } public static string SayEgnlish(string content) { return content; } public static string SayChinese(string content) 和 public static string SayEgnlish(string content):定义了两个静态方法,分别接受一个 string 类型的参数 content,并返回该参数本身。这两个方法的签名与 SayHello 委托一致,可以被 SayHello 委托引用。 常规的委托实例化、简化的赋值方式、Lambda 表达式和匿名委托。委托在 C# 中是一种强大的机制,它允许将方法作为参数传递,实现了代码的灵活性和可扩展性。
- java中的方法返回值使用泛型,实现灵活的返回值类型
- Android中WebView使用6,js调java实现播放视频
- rips中如何使用PHP虚拟机自带函数--token_get_all
- python实现了字符串的按位异或和php中的strpad函数
- 【转载】php中iconv函数使用方法
- RabbitMQ 优点和缺点- 消息可靠性:RabbitMQ 提供了持久化功能和消息确认机制,确保消息在各种情况下都能可靠地存储和处理。 灵活的路由:通过多种交换机类型和绑定规则,RabbitMQ 能够灵活地路由消息到指定的队列。 支持多种消息协议:实现了 AMQP 等(MQTT、STOMP)标准化、开放的消息队列协议,使其能够与多种语言编写的应用程序进行通信。 插件化扩展:RabbitMQ 提供了丰富的插件系统,可以通过插件扩展功能,如死信队列、压缩、追踪等。 高可用性:支持集群模式和镜像队列,确保服务的可用性 易用性和可管理性:提供了丰富的 API 和管理工具,以及多种客户端库和框架支持,易于集成和使用。 多语言支持:RabbitMQ 支持多种编程语言的客户端,包括 Java、Python、Ruby、C#、Node.js 等,方便开发人员集成到各种应用中。 高性能:在处理大量并发消息时表现出色。 广泛的社区支持:拥有庞大的开发者社区和丰富的文档资源。 劣势: 性能和吞吐量较低:相比于 Apache Kafka 等面向大数据流处理的消息队列系统,RabbitMQ 的吞吐量较低,不适合处理海量的实时数据流。RabbitMQ 的设计更注重消息的可靠性和灵活性,而非极高的吞吐性能。
- 一类账户认证API在Java、Python、PHP中的使用教程