const CryptoJS = require('./crypto-js'); // 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境 const db = cloud.database(); /** * 将字符串转化为数字(若字符串唯一,则结果也具有唯一性) * * @param {String} s 需要转换的字符串 * @param {Number} n 返回的结果的数字位数 */ async function convertToUniqueDigits(s, n) { // 使用哈希算法将字符串转换为数字 const m = sha256(s); // 将哈希值转换为数字,并将结果映射到指定的位数 let x = parseInt(m, 16) % (10n); // 如果结果中有重复的数字,增加一个偏移量 while (hasDuplicateDigits(x)) { x = (x + 1) % (10n); } //检查数据库是否存在这个id const hasUID = await checkHasUid(x); //存在这个id,则重新调用该函数并增加转化结果的位数 if(hasUID>0){ return convertToUniqueDigits(s,n+1); //发现不能使用++,会无限循环 } //不存在这个ID,直接返回结果 else{ return x; } } //检查是否存在相同的uid async function checkHasUid(uid){ const res = await db.collection('user_list').where({ uid: String(uid) }).count(); return res.total } function sha256(s) { // 使用 SHA-256 哈希算法将字符串转换为哈希值 const hash = CryptoJS.SHA256(s); return hash.toString(CryptoJS.enc.Hex); } function hasDuplicateDigits(x) { // 检查数字中是否有重复的数字 const digits = String(x).split(''); return digits.length !== new Set(digits).size; } module.exports = { convertToUniqueDigits: convertToUniqueDigits };
时间: 2023-06-12 22:07:55 浏览: 233
这是一个 Node.js 云函数,用于将字符串转换为唯一的数字。它使用了 CryptoJS 库来实现 SHA-256 哈希算法,将字符串转换为哈希值。然后将哈希值映射到指定的位数,如果结果中有重复的数字,则增加一个偏移量,直到得到一个唯一的数字。它还包含了一个函数来检查数据库中是否存在相同的唯一数字,如果存在则重新调用该函数并增加转化结果的位数。最后,它返回唯一数字。
相关问题
``` const CryptoJS = require('crypto-js'); ```
这行代码的作用是引入 Node.js 环境下的加密库 CryptoJS。CryptoJS 提供了多种加密算法,包括 AES、DES、Triple DES、Rabbit、RC4 等等。可以使用这些算法对数据进行加密和解密。使用 require() 函数将 CryptoJS 模块导入到当前文件中,然后通过 const 关键字创建一个常量 CryptoJS 来引用它。
const crypto = require('crypto');function encryptAES(text, key) { const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return iv.toString('hex') + ':' + encrypted;}function decryptAES(encryptedText, key) { const parts = encryptedText.split(':'); const iv = Buffer.from(parts.shift(), 'hex'); const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); let decrypted = decipher.update(parts.join(':'), 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}// 测试const key = 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6';const text = 'Hello, world!';const encrypted = encryptAES(text, key);console.log('Encrypted:', encrypted);const decrypted = decryptAES(encrypted, key);console.log('Decrypted:', decrypted);,帮我把这段代码转成python
以下是将上述Node.js的AES加密函数转化为Python的代码:
```python
import os
from Crypto.Cipher import AES
def encryptAES(text, key):
iv = os.urandom(16)
cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
encrypted = cipher.encrypt(pad(text.encode(), AES.block_size))
return iv.hex() + ':' + encrypted.hex()
def decryptAES(encryptedText, key):
parts = encryptedText.split(':')
iv = bytes.fromhex(parts[0])
encrypted = bytes.fromhex(parts[1])
cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
return decrypted.decode()
def pad(s, block_size):
padding = block_size - len(s) % block_size
return s + padding * chr(padding).encode()
def unpad(s, block_size):
padding = s[-1]
if padding < 1 or padding > block_size:
raise ValueError("Invalid padding")
if any(s[-i] != padding for i in range(1, padding+1)):
raise ValueError("Invalid padding")
return s[:-padding]
# 测试
key = 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6'
text = 'Hello, world!'
encrypted = encryptAES(text, key)
print('Encrypted:', encrypted)
decrypted = decryptAES(encrypted, key)
print('Decrypted:', decrypted)
```
这个函数使用了Python的Crypto模块,使用AES-256-CBC算法进行加密和解密。在加密时,我们使用一个随机生成的16字节的初始向量iv,将其与密文一起返回。在解密时,我们从加密文本中提取出iv,并使用它来创建解密器。
阅读全文