#sqlite #sqlite-extension #numbers #blobs #quickly #generate #boolean

sqlite-fastrand

一个用于快速生成数字和blob的SQLite扩展

3个版本

0.2.1 2023年8月6日
0.2.1-alpha.92023年6月10日

#2082 in 数据库接口

MIT/Apache

38KB
822

sqlite-fastrandom

一个用于快速生成随机数、布尔值、字符和blob的SQLite扩展。**不提供密码学安全性**。基于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()的不同之处

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() 的工作方式相同,但它提供了一个可选的 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 发布 GitHub tag (latest SemVer pre-release)
Rust cargoadd 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 👋🏼)在这个项目上投入了大量的时间和精力,以及 许多其他开源项目。如果你的公司或组织使用这个库(或者你很慷慨),那么请考虑 支持我的工作,或者与朋友分享这个项目!

另请参阅

依赖项

~13MB
~255K SLoC