Flutter安全整数ID生成插件safe_int_id的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter安全整数ID生成插件safe_int_id的使用

简介

SafeIntId 是一个用于生成符合 Number.MAX_SAFE_INTEGER 的非协调唯一ID的Flutter插件。它特别适用于需要在多个设备上生成不重复ID的应用场景。

现有解决方案

有许多优秀的唯一ID生成方案,例如Cuid2、KSUID、Nano ID、ObjectId等。然而,这些方案并不完全满足我们的特殊需求。

需求

  1. ID应适合64位带符号整数。
  2. ID应适合Web平台上的安全整数范围(±(2⁵³-1))。
  3. 在没有网络协调的情况下,在多个位置生成ID。
  4. 不同时间生成的ID应该完全没有碰撞概率。
  5. 在上述约束条件下,ID应尽可能唯一。

可选功能

  1. ID可以按创建时间排序。
  2. 可以从ID中提取创建时间戳。
  3. ID可以是URL友好的。
  4. ID可以选择包含自增计数器而不是随机部分。

设计与使用

导入库

首先,导入safe_int_id库:

import 'package:safe_int_id/safe_int_id.dart';

获取新ID

获取一个新的ID:

final id = safeIntId.getId();
print("id: $id");

获取创建时间

获取给定ID的创建时间:

final createdAt = safeIntId.getCreatedAt(id, isUtc: true);
print("createdAt: $createdAt");

使用自增计数器

如果在同一设备上生成大量ID,可以使用incId()方法代替getId()

final id1 = safeIntId.incId();
final id2 = safeIntId.incId();
assert(id1 < id2);

自定义配置

可以通过自定义配置来调整ID生成逻辑:

final customId = SafeIntId(
  firstYear: 2023, // 第一年
  random: Random(), // 随机生成器
  randomValues: 1024, // 每毫秒可能的随机值数量
);

// 安全年数
assert(customId.safeYears == 278);

// 最后安全年份
assert(customId.lastSafeYear == 2300);

示例代码

以下是一个完整的示例代码,展示了如何使用SafeIntId

/// Example of how to use `SafeIntId`.
/// Run it with `dart run --enable-asserts example/safe_int_id_example.dart`

import "dart:math";
import "package:safe_int_id/safe_int_id.dart";

void main() {
  // Get a new uncoordinated unique ID
  final id = safeIntId.getId();
  print("id: $id");

  // Get [DateTime] when given [id] was created at.
  final createdAt = safeIntId.getCreatedAt(id, isUtc: true);
  print("createdAt: $createdAt");

  // Increment a counter instead of using a random value.
  final id1 = safeIntId.incId();
  final id2 = safeIntId.incId();
  assert(id1 < id2);

  // Custom configuration, defaults are:
  final customId = SafeIntId(
    firstYear: 2023, // The first year you use this ID.
    random: Random(), // Random generator, e.g. `Random.secure()`
    randomValues: 1024, // Number of possible random values per millisecond.
  );

  // How many years since [firstYear] this ID will be safe:
  assert(customId.safeYears == 278);

  // Last year this ID will be safe:
  assert(customId.lastSafeYear == 2300);

  // Custom configuration has the same [getId] and [getCreatedAt] methods:
  assert(!customId.getCreatedAt(customId.getId()).isBefore(createdAt));
}

通过上述示例代码,您可以轻松地在Flutter应用中集成并使用safe_int_id插件来生成唯一的整数ID。


更多关于Flutter安全整数ID生成插件safe_int_id的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全整数ID生成插件safe_int_id的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用safe_int_id插件生成安全整数ID的示例代码。safe_int_id插件允许你生成一个64位的安全整数ID,这在需要唯一标识符时非常有用。

首先,确保你的Flutter项目中已经添加了safe_int_id插件。如果还没有添加,可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  safe_int_id: ^x.y.z  # 请替换为最新的版本号

然后运行flutter pub get来安装插件。

以下是一个完整的Flutter应用示例,展示了如何使用safe_int_id插件生成安全整数ID:

import 'package:flutter/material.dart';
import 'package:safe_int_id/safe_int_id.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Safe Int ID Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SafeIntIdDemo(),
    );
  }
}

class SafeIntIdDemo extends StatefulWidget {
  @override
  _SafeIntIdDemoState createState() => _SafeIntIdDemoState();
}

class _SafeIntIdDemoState extends State<SafeIntIdDemo> {
  String? generatedId;

  void _generateId() async {
    // 使用SafeIntId.generate()方法生成安全整数ID
    int? id = await SafeIntId.generate();
    setState(() {
      generatedId = id.toString();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Safe Int ID Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Generated ID:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              generatedId ?? 'Press the button to generate an ID',
              style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _generateId,
              child: Text('Generate ID'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,包含一个按钮和一个显示生成ID的文本。当点击按钮时,会调用SafeIntId.generate()方法生成一个安全整数ID,并将其显示在界面上。

请确保在实际项目中替换safe_int_id: ^x.y.z为当前最新的版本号,以获取最新的功能和修复。

回到顶部