标签: generator

python SystemRandom/os.urandom是否总有足够的熵来获得良好的加密

我有一个密码生成器:

import random, string

def gen_pass():
    foo = random.SystemRandom()
    length = 64
    chars = string.letters + string.digits
    return ''.join(foo.choice(chars) for _ in xrange(length))
Run Code Online (Sandbox Code Playgroud)

根据文档,SystemRandom使用os.urandom,它使用/ dev/urandom来丢弃随机的cryto位.在Linux中,您可以从/ dev/urandom或/ dev/random获取随机位,它们都使用内核可以获得的任何熵.可以使用tail/proc/sys/kernel/random/entropy_avail检查可用的熵量,这将返回如下数字:129.可用的熵越多./ dev/urandom和/ dev/random之间的区别在于/ dev/random只会在entropy_avail足够高(如至少60)时吐出位,而/ dev/urandom总是吐出位.文档说/ dev/urandom对加密有好处,你只需要使用/ dev/random来获得ssl证书等.

我的问题是gen_pass是否适合制作强大的加密级密码?如果我尽快调用此函数,我会在某个时刻停止获取强大的cryto位,因为熵池已经耗尽了吗?

这个问题也可能是为什么的/ dev/urandom的总是产生强烈cryto位不在乎entropy_avail?

有可能设计/ dev/urandom使其带宽受到可以猜测与熵量相关的周期数的限制,但这是猜测,我无法找到答案.

这也是我的第一个stackoverflow问题所以请批评我.我担心当知道答案的人可能知道背景时,我给了很多背景.

谢谢

更新

我写了一些代码来查看熵池,同时/dev/urandom从中读取:

import subprocess
import time

from pygooglechart import Chart
from pygooglechart import SimpleLineChart
from pygooglechart import Axis

def check_entropy():
    arg = ['cat', '/proc/sys/kernel/random/entropy_avail']
    ps = subprocess.Popen(arg,stdout=subprocess.PIPE)
    return int(ps.communicate()[0])

def run(number_of_tests,resolution,entropy = []):
    i …
Run Code Online (Sandbox Code Playgroud)

python linux random cryptography generator

21
推荐指数
1
解决办法
6376
查看次数

使用具有词典理解的收益率

作为一个人为的例子:

myset = set(['a', 'b', 'c', 'd'])
mydict = {item: (yield ''.join([item, 's'])) for item in myset}
Run Code Online (Sandbox Code Playgroud)

list(mydict)给出:

['as', 'cs', 'bs', 'ds', {'a': None, 'b': None, 'c': None, 'd': None}]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?怎么yield办?无论表达式yield如何,这种行为是否一致?

注意:我知道做的mydict = {item: ''.join([item, 's']) for item in myset}会给字典{'a': 'as', 'b': 'bs', 'c': 'cs', 'd': 'ds'},这似乎是我想在这里做的.

python yield generator

21
推荐指数
1
解决办法
7719
查看次数

为什么范围对象"不是迭代器"?

我写了这个并且期望0:

>>> x = range(20)
>>> next(x)
Run Code Online (Sandbox Code Playgroud)

相反,我得到了:

TypeError:'range'对象不是迭代器

但我以为这是一个发电机?

最初的答案产生了我最初对自己说的同样的事情:它是一个可迭代的,而不是一个交互者.但是,如果两者都是简单的生成器,那么这就无法解释为什么会这样做:

>>> x = (i for i in range(30))
>>> next(x)
0
Run Code Online (Sandbox Code Playgroud)

python generator python-3.x

21
推荐指数
3
解决办法
9098
查看次数

我可以从内部函数中屈服吗?

使用ES6生成器,我看到如下代码:

var trivialGenerator = function *(array) {
    var i,item;
    for(var i=0; i < array.length; i++){
        item = array[i];
        yield item;
    };
};
Run Code Online (Sandbox Code Playgroud)

是否有可能写下更像下面的代码?

var trivialGenerator = function *(array) {
    array.forEach(function *(item){
        yield item;
    });
};
Run Code Online (Sandbox Code Playgroud)

我问,因为经典for循环是令人厌恶的.

javascript for-loop yield generator ecmascript-6

21
推荐指数
2
解决办法
8905
查看次数

简单随机英语句子生成器

我需要一个简单的随机英语句子生成器.我需要用自己的语言填充它,但它需要能够制作更长的句子,至少遵循英语规则,即使它们没有意义.

我希望那里有数百万人,所以不是重新发明轮子,我希望你知道一个人的资源,或者一个资源,它会给我足够的信息,我没有必要追捕我的生锈的英语技能.

random generator markov-chains

20
推荐指数
2
解决办法
4万
查看次数

Ruby生成器与Python生成器

我一直在研究Ruby和Python生成器之间的相似之处/差异(Enumerators在Ruby中称为),并且据我所知,它们几乎相同.

然而,我注意到的一个区别是Python Generators支持一种close()方法,而Ruby Generators则不支持.从Python文档中可以看出该close()方法执行以下操作:

在生成器功能暂停的位置引发GeneratorExit.如果生成器函数然后引发StopIteration(通过正常退出,或者由于已经关闭)或GeneratorExit(通过不捕获异常),则关闭返回其调用者.

Ruby Enumerators不支持该close()方法有充分的理由吗?还是意外遗漏?

我还发现Ruby Enumerators支持一种rewind()方法,而Python生成器却没有......这也是有原因的吗?

谢谢

ruby python generator enumerator

20
推荐指数
2
解决办法
4542
查看次数

在Scala中实现'yield'的首选方法是什么?

我正在为博士研究编写代码并开始使用Scala.我经常要做文字处理.我已经习惯了Python,其'yield'语句对于在大型(通常是不规则结构化的)文本文件上实现复杂的迭代器非常有用.类似的结构存在于其他语言(例如C#)中,这是有充分理由的.

是的我知道之前有过这样的线索.但它们看起来像是黑客攻击(或至少解释得很糟糕)的解决方案,这些解决方案并不能很好地运作并且通常具有不明确的局限性.我想编写这样的代码:

import generator._

def yield_values(file:String) = {
  generate {
    for (x <- Source.fromFile(file).getLines()) {
      # Scala is already using the 'yield' keyword.
      give("something")
      for (field <- ":".r.split(x)) {
        if (field contains "/") {
          for (subfield <- "/".r.split(field)) { give(subfield) }
        } else {
          // Scala has no 'continue'.  IMO that should be considered
          // a bug in Scala.
          // Preferred: if (field.startsWith("#")) continue
          // Actual: Need to indent all following code
          if (!field.startsWith("#")) {
            val some_calculation = { ... …
Run Code Online (Sandbox Code Playgroud)

python text-processing scala yield generator

20
推荐指数
3
解决办法
3822
查看次数

Javascript生成器:了解它们

我很确定我对发电机的理解本质上已被打破.所有在线资源似乎都存在冲突,这会带来令人难以置信的困难和令人困惑的学习体验.

据我所知,该yield关键字使当前正在执行的代码块等待一个值,而不是抛出要在回调中执行的剩余代码.因此,正如大多数教程所指出的那样,您可以使用:

(function *() {
     // Wait until users have be got and put into value of `results`
     var results = yield db.get("users");
     // And continue
     view.display(results);
})();
Run Code Online (Sandbox Code Playgroud)

代替:

db.get("user", function(results) {
    view.display(results);
});
Run Code Online (Sandbox Code Playgroud)

是的,在我尝试编写自己的发电机之前,这一切都很好.我遇到了几个问题:

  • 上面的第一个示例代码将不会运行,因为没有任何东西可以迭代生成器,对吗?有些人需要打电话给.next某个地方,对吗?
  • 整个API必须重写到I/O调用以支持生成器,对吗?
  • 从我收集的内容来看,yield似乎代表值等待最常见的用例,而在实现部分(读取:返回值为/ inside db.get)yield似乎代表将此值发送回当前正在等待的块以恢复执行.

举个例子:

function *fn() {
    yield 1;
    yield "a";
}

var gen = fn();
gen.next(); // 1
gen.next(); // "a";
Run Code Online (Sandbox Code Playgroud)

yield在该上下文中,将值返回而不是等待结果.在上面的第一个示例中,它等待来自db.get和恢复执行的结果,而不是"返回"或发回一个值.如果db.get情况属实,这本身并不是同步的吗?我的意思是,它不完全相同: …

javascript yield generator node.js

20
推荐指数
1
解决办法
4734
查看次数

JavaScript中的递归生成器

我正在尝试为顺序遍历编写递归生成器.

class Tree {
  *inOrderTraversal() {
    function* helper(node) {
      if (node.left !== null) {
        // this line is executed, but helper is not being called
        helper(node.left); 
      }
      yield node.value;
      if (node.right !== null) {
        helper(node.right);
      }
    }

    for (let i of helper(this.root)) {
      yield i;
    }
  }
  // other methods omitted
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼发电机:

const tree = new Tree();
tree.add(2);
tree.add(1);
tree.add(3);

for (let i of tree.inOrderTraversal()) {
    console.log(i); // only prints 2
}
Run Code Online (Sandbox Code Playgroud)

为什么发电机只能屈服2?为什么它至少没有产生1之前2? …

javascript recursion generator ecmascript-6

20
推荐指数
2
解决办法
4934
查看次数

嵌套的生成器表达式意外地表现

使用以下代码:

A = [1, 2]
B = [-2, -1]
C = [-1, 2]
D = [0, 2]

ab = (a + b for a in A for b in B)
cd = (c + d for c in C for d in D)
abcd = (e_ab + e_cd for e_ab in ab for e_cd in cd)
Run Code Online (Sandbox Code Playgroud)

len(abcd)预期是16,但它实际上是4.如果我使用列表理解,问题就会消失.这是为什么?

python generator

20
推荐指数
3
解决办法
2095
查看次数