一个 SQLite 扩展,用于快速生成随机数、布尔值、字符和 Blob。不具备加密安全性。基于 sqlite-loadable-rs
和 fastrand 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
包含 start
和 end
(不包含)参数,以在指定范围内生成随机数。
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()
是 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()
相同,但提供可选的 start
和 end
参数来指定生成随机数的范围。
select fastrand_int64(); -- 5216671854996406003
select fastrand_int64(0, 100); -- 19
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 |
|
Datasette | datasette install datasette-sqlite-fastrand |
|
Node.js | npm install sqlite-fastrand |
|
Deno | deno.land/x/sqlite_fastrand |
|
Ruby | gem install sqlite-fastrand |
|
GitHub Release | ||
Rust | cargo add sqlite-fastrand |
发布页面包含适用于 Linux x86_64、MacOS 和 Windows 的预构建二进制文件。
如果您想将 sqlite-fastrand
用作运行时可加载扩展,请从发布版本下载 fastrand0.dylib
(适用于 MacOS)、fastrand0.so
(适用于 Linux)或 fastrand0.dll
(适用于 Windows)文件,并将其加载到您的 SQLite 环境中。
注意:文件名中的
0
(fastrand0.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 扩展