3个版本
0.2.1 | 2023年8月6日 |
---|---|
0.2.1-alpha.9 | 2023年6月10日 |
#2082 in 数据库接口
38KB
822 行
sqlite-fastrandom
一个用于快速生成随机数、布尔值、字符和blob的SQLite扩展。**不提供密码学安全性**。基于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()
和randomblob()
是强大的工具,但有时可能会令人困惑。
例如,random()
函数返回 "...一个介于 -9223372036854775808 和 +9223372036854775807 之间的伪随机整数",这是 64 位有符号整数的最大和最小值。
select random(); -- 8247412491507365610
select random(); -- 8124278049726255864
这可能在你的用例中工作得很好,但通常我需要一个更加受限的随机数,比如 0-100
之间的任意数。如果你使用 abs()
和模运算符 %
,技术上可以使用 random()
来实现,但这会变得有些尴尬
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 发布 | ||
Rust | cargoadd 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扩展
依赖项
~13MB
~255K SLoC