c#&js ASCII与随机数

本文探讨了在C#和JavaScript中生成指定范围内的随机数的方法,包括单个和多个范围的随机数生成,并展示了如何将这些随机数转换为ASCII字符,用于生成随机字符串,涵盖大小写字母和数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有感而发,为什么会写这个呢,是因为曾经有这么个题,从26个英文字母里随机取1000个,然后我的做法居然是,先手动建个数组,手动往里填“a-z”26个字符,再用随机下标去取,实在是惨不忍睹

1.生成范围内的伪随机整数(result >=min && result < max)
c#.

Random r = new Random();
r.Next(min, max)
//当想连续生成随机数时,不能new多个实例,应该使用公用的实例,连续Next,不过我发现我在 .net core里 可以连续new多个实例而没有重复.
//正确用法
//1.使用同一个实例
Random r = new Random();
 for(int i = 0; i< 1000; i++)
 {
     Console.WriteLine(r.Next(65,65+26));
 }
 //2.每次给不同的随机种子
 for(int i = 0; i< 1000; i++)
 {
 	 Random r = new Random(Guid.NewGuid().ToByteArray()[0]);
     Console.WriteLine(r.Next(65,65+26));
 }
 
//错误用法(.net core里正常)
 for(int i = 0; i< 1000; i++)
 {
 	Random r = new Random();
    Console.WriteLine(r.Next(65,65+26));
 }

js.

function Random(min,max){return Math.floor(Math.random()*(max-min)+min);}

2.生成多个范围内的伪随机整数
c#.

RandomRang(new int[][] { new int[] { 65, 65 + 26 }, new int[] { 97, 97 + 26 } });
RandomRang(new int[] { 65, 65 + 26 }, new int[] { 97, 97 + 26 });
RandomRang(new int[] { 65, 65 + 26 });
int RandomRang(params int[][] arguments)
{
      if (arguments.Length > 0)
      {
          Random r = new Random(Guid.NewGuid().ToByteArray()[0]);//每次给不同的随机种子
          var temp = new List<int>();
          for (var i = 0; i < arguments.Length; i++)
          {
              temp.Add(r.Next(arguments[i][0], arguments[i][1]));
          }
          return temp[r.Next(0, temp.Count)];
      }
      return 0;
  }

js.

RandomRang([65,65+26]);
RandomRang([65,65+26],[97,97+26],[48,48+10]);
function RandomRang(){
	if(arguments.length>0){
		var temp=[];
		for(var i=0;i<arguments.length;i++){
			temp.push(random(arguments[i][0],arguments[i][1]));
		 }
		return temp[random(0,temp.length)];
	 } 
 }

然后就可以把它们和ASCII码联系起来玩了
1.从26个小写字母里随机取1000个
c#.

StringBuilder strB = new StringBuilder(1000);
Random r = new Random();
for (int i = 0; i < 1000; i++)
{   
    strB.Append(Encoding.ASCII.GetString(new byte[] { (byte)(r.Next(97, 97+ 26)) }));
}
Console.WriteLine(strB.ToString());

js.

var temp=[];
for (var i = 0; i < 1000; i++)
{   
    temp.push(String.fromCharCode(Random(97,97+26)));
}
console.log(temp.join(''));

2.从26个大写字母里随机取1000个
c#.

StringBuilder strB = new StringBuilder(1000);
Random r = new Random();
for (int i = 0; i < 1000; i++)
{   
    strB.Append(Encoding.ASCII.GetString(new byte[] { (byte)(r.Next(65, 65+ 26)) }));
}
Console.WriteLine(strB.ToString());

js.

var temp=[];
for (var i = 0; i < 1000; i++)
{   
    temp.push(String.fromCharCode(Random(65,65+26)));
}
console.log(temp.join(''));

2.从26个大写字母、26个小写字母、0-9里随机取1000个
c#.

StringBuilder strB = new StringBuilder(1000);
Random r = new Random();
for (int i = 0; i < 1000; i++)
{   
    strB.Append(Encoding.ASCII.GetString(new byte[] { (byte)(RandomRang(new int[] { 65, 65 + 26 }, new int[] { 97, 97 + 26 }, new int[] { 48, 48 + 10 })) }));
}
Console.WriteLine(strB.ToString());

js.

var temp=[];
for (var i = 0; i < 1000; i++)
{   
    temp.push(String.fromCharCode(randomRang([65,65+26],[97,97+26],[48,48+10])));
}
console.log(temp.join(''));

如果不记得a、A、0的ASCII码是多少,也不用怕
c#.

var A=Encoding.ASCII.GetBytes("A")[0];
var a=Encoding.ASCII.GetBytes("a")[0];

js.

var A='A'.charCodeAt();
var a='a'.charCodeAt();
### C# 中实现 SHA1 签名的方法 在 C# 中可以利用 `System.Security.Cryptography` 命名空间下的类来生成 SHA1 签名。以下是基于提供的站内引用内容和标准实践的具体说明。 #### 使用 MessageDigest 实现 SHA1 加密 通过调用 .NET 提供的安全库中的 `SHA1CryptoServiceProvider` 类,能够轻松完成 SHA1 的哈希计算功能[^1]。具体操作流程包括初始化加密对象、转换输入数据为字节数组形式并执行哈希运算,最后将结果编为十六进制字符串表示形式。 #### 参数处理签名串构建逻辑 依据描述的微信 JS-SDK 配置需求,在准备用于签名的数据之前需先整理好四个必要组件:随机数 (`noncestr`)、有效票据 (`jsapi_ticket`)、时间戳 (`timestamp`) 和页面 URL 地址 (不含片段标识符部分)[^2]。这些项应统一调整成小写字母状态再依照 ASCII顺序排列组合起来形成最终待签字符串。 下面是完整的 C# 示例代展示整个过程: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; public class Sha1SignatureGenerator { public static string GenerateSha1Signature(string jsApiTicket, string nonceStr, long timeStamp, string currentUrl) { var parameters = new SortedDictionary<string, string> { { "jsapi_ticket", jsApiTicket }, { "noncestr", nonceStr }, { "timestamp", timeStamp.ToString() }, { "url", currentUrl } }; StringBuilder sb = new StringBuilder(); foreach (var pair in parameters) { sb.Append(pair.Key).Append("=").Append(pair.Value).Append("&"); } string plainText = sb.ToString().TrimEnd('&'); using (SHA1 sha1Hasher = SHA1.Create()) { byte[] dataToHash = Encoding.UTF8.GetBytes(plainText); byte[] hashedData = sha1Hasher.ComputeHash(dataToHash); StringBuilder hexString = new StringBuilder(); foreach (byte b in hashedData) hexString.AppendFormat("{0:x2}", b); return hexString.ToString(); // This is the final signature. } } } ``` 此函数接受四个参数作为输入,并返回经过 SHA1 处理后的摘要值。注意这里采用了 `SortedDictionary` 来自动按 key 名称排序以满足算法要求。 #### 结果验证注意事项 为了确保生成的结果正确无误,请务必确认所使用的 ticket 是最新有效的;同时也要仔细核对传入的时间戳数值及时区设置是否一致。另外还要留意实际请求地址可能存在的转义字符差异等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值