sqlite-fastrand 作者 asg017

星标

README 源代码

sqlite-fastrandom

一个 SQLite 扩展,用于快速生成随机数、布尔值、字符和 Blob。不具备加密安全性。基于 sqlite-loadable-rsfastrand crate

根据我的本地基准测试,fastrand_int64() 比 SQLite 的 random() 快约 2.6 倍,而 fastrand_blob()randomblob() 快约 1.6 倍。sqlite-fastrand 还提供了一个更符合人体工程学的 API,支持自定义范围、种子和布尔/字符。然而,它产生的是伪随机结果,而不是“真正”的随机。

如果您的公司或组织觉得此库有用,请考虑支持我的工作

用法

.load ./fastrand0
select fastrand_int(); -- 556823563
select fastrand_int(); -- 363294620
select fastrand_int(); -- -320463573

为底层随机数生成器设置一个种子,以获得确定性值。

select fastrand_seed_set(1234);
select fastrand_int(); -- -2058591105
select fastrand_int(); -- -211244717
select fastrand_int(); -- -1772832958

select fastrand_seed_set(1234);
select fastrand_int(); -- -2058591105
select fastrand_int(); -- -211244717
select fastrand_int(); -- -1772832958

包含 startend(不包含)参数,以在指定范围内生成随机数。

select fastrand_int(0, 10); -- 0
select fastrand_int(0, 10); -- 9
select fastrand_int(0, 10); -- 6

生成随机数字、小写/大写/字母/字母数字字符。

select fastrand_alphabetic(); -- 's'
select fastrand_alphanumeric(); -- '2'
select fastrand_char(); -- '񠞼'
select fastrand_lowercase(); -- 'g'
select fastrand_uppercase();-- 'M'

select fastrand_digit(16); -- 'c'

生成一个介于 0 和 1 之间的随机浮点数。

select fastrand_double(); -- 0.740834390248454
select fastrand_double(); -- 0.46936608707793

random()randomblob() 的区别

内置函数 random()randomblob() 是 SQLite 标准库中已有的强大工具,但有时它们可能会令人困惑。

例如,random() 函数返回“... 一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数”,这些是 64 位带符号整数的最小值和最大值。

select random(); -- 8247412491507365610
select random(); -- 8124278049726255864

这在您的用例中可能没问题,但我通常想要一个限制范围的随机数,例如 0-100 之间的任意数字。理论上可以使用 random() 通过 abs() 和模数运算符 % 来实现,但这会变得很麻烦。

select abs(random()) % 100; -- 96
select abs(random()) % 100; -- 41

fastrand_int64() 函数的功能与 random() 相同,但提供可选的 startend 参数来指定生成随机数的范围。

select fastrand_int64(); -- 5216671854996406003
select fastrand_int64(0, 100); -- 19

randomblob(N)

randomblob(N) 函数返回一个包含 N 个伪随机字节的 blob。如果 N 小于 1,则返回一个 1 字节的随机 blob。

select hex(randomblob(16)); -- '4E7EFDB9E687EED4F376359986CB695E'
select hex(randomblob(16)); -- 'F6CFF9249E3BD8755E10D6BB3CA81C66'

fastrand_blob(N) 函数的作用方式相同。

select hex(fastrand_blob(16)); -- 'D86FF5409D3FAD7DBE707580C7E7DE14'
select hex(fastrand_blob(16)); -- 'AB72BFE9480197F487933E8071072D4A'

安装

语言 安装
Python pip install sqlite-fastrand PyPI
Datasette datasette install datasette-sqlite-fastrand Datasette
Node.js npm install sqlite-fastrand npm
Deno deno.land/x/sqlite_fastrand deno.land/x release
Ruby gem install sqlite-fastrand Gem
GitHub Release GitHub tag (latest SemVer pre-release)
Rust cargo add sqlite-fastrand Crates.io

发布页面包含适用于 Linux x86_64、MacOS 和 Windows 的预构建二进制文件。

作为可加载扩展

如果您想将 sqlite-fastrand 用作运行时可加载扩展,请从发布版本下载 fastrand0.dylib(适用于 MacOS)、fastrand0.so(适用于 Linux)或 fastrand0.dll(适用于 Windows)文件,并将其加载到您的 SQLite 环境中。

注意:文件名中的 0fastrand0.dylib/fastrand0.so/fastrand0.dll)表示 sqlite-fastrand 的主版本号。目前 sqlite-fastrand 处于 v1 之前,因此未来的版本可能会有重大更改。

例如,如果您正在使用SQLite CLI,您可以这样加载库:

.load ./fastrand0
select fastrand_version();
-- v0.1.0

或在 Python 中,使用内置的sqlite3 模块

import sqlite3
con = sqlite3.connect(":memory:")
con.enable_load_extension(True)
con.load_extension("./fastrand0")
print(con.execute("select fastrand_version()").fetchone())
# ('v0.1.0',)

或在 Node.js 中使用better-sqlite3

const Database = require("better-sqlite3");
const db = new Database(":memory:");
db.loadExtension("./fastrand0");
console.log(db.prepare("select fastrand_version()").get());
// { 'fastrand_version()': 'v0.1.0' }

或使用Datasette

datasette data.db --load-extension ./fastrand0

支持

我 (Alex 👋🏼) 在此项目和许多其他开源项目上投入了大量时间和精力。如果您的公司或组织使用了此库(或者您慷慨解囊),那么请考虑支持我的工作,或者与朋友分享此项目!

另请参阅

  • sqlite-xsv,一个用于处理 CSV 的 SQLite 扩展
  • sqlite-loadable,一个用于用 Rust 编写 SQLite 扩展的框架
  • sqlite-http,一个用于进行 HTTP 请求的 SQLite 扩展