Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何生成字母数字字符的随机字符串?_String_Random_Utf 8_Rust_Char - Fatal编程技术网

String 如何生成字母数字字符的随机字符串?

String 如何生成字母数字字符的随机字符串?,string,random,utf-8,rust,char,String,Random,Utf 8,Rust,Char,问题的第一部分可能非常常见,有足够的代码示例解释如何生成随机的字母数字字符串。我使用的代码片段来自 使用rand:{thread\u rng,rng}; 使用rand::distributions::字母数字; fn main(){ 让rand\u string:string=thread\u rng() .示例(字母和数字) .take(30) .收集(); println!(“{}”,rand_字符串); } 但是,这段代码不会编译(注意:我每天晚上都在上): error[E0277]:无

问题的第一部分可能非常常见,有足够的代码示例解释如何生成随机的字母数字字符串。我使用的代码片段来自

使用rand:{thread\u rng,rng};
使用rand::distributions::字母数字;
fn main(){
让rand\u string:string=thread\u rng()
.示例(字母和数字)
.take(30)
.收集();
println!(“{}”,rand_字符串);
}
但是,这段代码不会编译(注意:我每天晚上都在上):

error[E0277]:无法通过迭代器在`u8类型的元素上生成`String`类型的值`
-->src/main.rs:8:10
|
8 |收集();
|无法从'std::iter::Iterator'生成'String'类型的值`
|
=帮助:`String'未实现特性`FromIterator``
好的,生成的元素类型为
u8
。我猜这是
u8
的数组或向量:

使用rand:{thread\u rng,rng};
使用rand::distributions::字母数字;
fn main(){
设r=螺纹
.示例(字母和数字)
.take(30)
收集::();
设s=String::from_utf8_lossy(&r);
println!(“{}”,s);
}
这是编译和工作

2dCsTqoNUR1f0EzRV60IiuHlaM4TfK
一切都很好,只是我想问一下,是否有人可以解释关于类型的具体情况以及如何优化

问题

  • .sample\u iter(&字母数字)
    生成
    u8
    而不是
    char
    s
  • 如何避免第二个变量
    s
    并直接将
    u8
    解释为utf-8字符?我猜记忆中的表示形式根本不会改变
  • 这些字符串的长度应始终为30。如何优化
    Vec
    之外的堆分配?此外,它们实际上可能是
    char[]
    而不是
    String
    s
  • 对于
    rand::distributions::Alphanumeric
    显示,如果要将
    u8
    s转换为
    char
    s,则应使用
    char::from
    函数
    映射它们:

    使用rand:{thread\u rng,rng};
    使用rand::distributions::字母数字;
    fn main(){
    让rand\u string:string=thread\u rng()
    .示例(字母和数字)
    .map(char::from)//在此处添加了映射
    .take(30)
    .收集();
    println!(“{}”,rand_字符串);
    }
    

    .sample\u iter(&字母数字)
    产生u8而不是字符

    是的,在rand v0.8中进行了更改:

    字母数字的impl分布
    :

    字母数字的impl分布 如何避免第二个变量
    s
    并直接将
    u8
    解释为utf-8字符?我猜记忆中的表示形式根本不会改变

    有几种方法可以做到这一点,最明显的是将每个
    u8
    转换为
    char

    让s:String=thread\u rng()
    .示例(字母和数字)
    .take(30)
    .map(| x | x作为字符)
    .收集();
    
    或者,使用:

    让s:String=thread\u rng()
    .示例(字母和数字)
    .take(30)
    .map(char::from)
    .收集();
    
    当然,在这里,因为您知道每个
    u8
    必须是有效的UTF-8,所以可以使用,它比\u utf8\u lossy中的
    更快(尽管可能与
    as char
    方法的速度差不多):

    让s=不安全{
    字符串::from_utf8_未选中(
    线程_rng()
    .示例(字母和数字)
    .take(30)
    收集::(),
    )
    };
    
    如果由于某种原因,
    不安全
    困扰了你,你想保持安全,那么你可以使用较慢的
    打开
    结果
    ,这样你会得到恐慌而不是UB(即使代码不应该恐慌或UB):

    让s=String::from_utf8(
    线程_rng()
    .示例(字母和数字)
    .take(30)
    收集::(),
    ).unwrap();
    
    这些字符串的长度应始终为30。如何优化
    Vec
    之外的堆分配?此外,它们实际上可以是
    char[]
    而不是字符串

    首先,相信我,你不需要字符数组。和他们一起工作并不有趣。如果需要堆栈字符串,请使用
    u8
    数组,然后使用类似或更快的函数(同样,仅可使用,因为您知道将生成有效的utf8)

    关于优化堆分配,请参阅。基本上,这是不可能的,只要有一点粗俗/丑陋(例如,制作自己的函数,将迭代器收集到一个包含30个元素的数组中)


    一旦它们最终稳定下来,就会有一个更漂亮的解决方案。

    我想你应该提到一个可能的原因,让你更喜欢
    Vec
    而不是
    Vec
    char
    总是4字节长,这意味着对于任何ASCII字母数字序列来说,存储char将浪费三倍于所需的内存。