问题列表 - 第6586页

确定性函数的术语没有副作用?

我需要适用于特定类型功能的术语.

假设您在SQL数据库中编写了一个函数,其输入和输出包含在数据库事务的范围内.

也就是说,如果在数据库事务的范围内调用此函数,则该函数使用的所有数据都在同一范围内可用.它可以查询数据库表,但是它无法从文件系统读取文件,或ping网站等.如果在具有REPEATABLE READ隔离的单个事务中调用该函数两次,则应该得到相同的结果,即使其他客户端正在对数据库进行更改.

同样,除了在相同的事务范围内,该函数没有副作用.不允许在数据库事务范围之外的状态更改.该函数不应该发送电子邮件,也不应该写入文件系统,也不应该存储值memcached等.如果函数在数据库中更改数据,那没关系,因为如果调用事务被回滚,那么函数的效果也是如此.

函数的参数是可以的,因为它们基本上用作常量.

对于这种类型的函数,适当的术语是什么?"确定性"似乎并不具体.你会如何描述这类功能?


谢谢你的回答,但没有一个是我的想法.幂等因素最接近,所以我将其标记为已接受的答案.但无论如何,你们每个人都得到了我的支持.

  • 纯函数没有副作用,它们的结果完全基于它们的参数.给出相同参数的结果总是相同的.这不起作用,因为我想到的数据库函数可以基于数据的状态,并且该函数也可以影响数据的状态.

  • 幂等函数可以根据数据状态返回结果,并且给定相同的数据状态,结果总是相同的.但这并不适合我的想法; 无论调用函数多少次,幂等函数的效果都必须导致不变的结果.但是,事务隔离中所做的更改与该范围外部所做的更改之间没有区别.

computer-science function idempotent

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

当我应该而且不应该在C中使用"const"时感到困惑

我有一个字典,如下所示:

typedef struct dictNode {
    int key;
    char *value;
    struct dictNode *next;
} Dict;
Run Code Online (Sandbox Code Playgroud)

get()函数是这样的:

char *get(const Dict *dict, int key) {
    if(!dict) return NULL;

    Dict *currPtr = dict;

    while(currPtr) {
        if(currPtr->key == key) {
            return currPtr->value;
        }

        currPtr = currPtr->next;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译此代码会产生以下错误:
dict.c:85:warning:initialization从指针目标类型中丢弃限定符

此警告涉及以下行:

Dict *currPtr = dict;
Run Code Online (Sandbox Code Playgroud)

如果我在该行之前添加"const",如下所示:

const Dict *currPtr = dict;
Run Code Online (Sandbox Code Playgroud)

警告消失了......

1)我不明白的第一件事就是:我在get()中dict参数中添加了"const",这样编译器会在我尝试更改dict指向的地址时警告我,否则我将无法访问主程序中的字典导致我丢失了我指向的地址.现在,我正在创建一个新指针currPtr,它指向与dict相同的位置.这样,我使用这个指针来遍历字典并保持dict指针不变.为什么我还需要constcurrPtr

2)我不明白的第二件事是:线currPtr = currPtr-> …

c pointers const

6
推荐指数
2
解决办法
848
查看次数

ContainsKey线程安全

在以下代码中:

public class StringCache
{
    private readonly object lockobj = new object();

    private readonly Dictionary<int, string> cache = new Dictionary<int, string>();

    public string GetMemberInfo(int key)
    {
        if (cache.ContainsKey(key))
            return cache[key];
        lock (lockobj)
        {
            if (!cache.ContainsKey(key))
                cache[key] = GetString(key);
        }
        return cache[key];
    }

    private static string GetString(int key)
    {
        return "Not Important";
    }
}
Run Code Online (Sandbox Code Playgroud)

1)ContainsKey线程是否安全?IOW,如果在另一个线程向字典中添加内容时执行该方法会发生什么?2)对于第一个返回缓存[key],是否有可能返回乱码值?

TIA,

MB

c# multithreading dictionary

8
推荐指数
2
解决办法
5559
查看次数

用于Windows应用程序的数据库是什么?

我正在开发.net中的小型Windows应用程序.我应该使用什么数据库?

数据库结构

表1:不超过3个字段:50多个记录(添加,删除)

表2:不超过10个字段:10-20个记录(添加,删除)

我想过使用XMLDatabase但有些人说不建议使用它.这是什么原因?如果可以将XML文件用作数据库,那么您可以建议一些教程或最佳实践吗?我之前使用过XML文件.使用它作为数据库有什么不同吗?

我也计划在一段时间后将这个应用程序分发给我的朋友,这些人不是程序员,他们不太懂技术.

那么,如果我使用SQL Server,我该如何在其他机器中部署它?如何将其添加到安装文件中?

更新:感谢您的回答.我要去SQLite,如果有人有兴趣,这里有一个关于SQLite和.net 的教程.

.net xml database

3
推荐指数
1
解决办法
385
查看次数

有没有办法在Eclipse中将代码导出为HTML?

我知道NetBeans有这个功能,但我在Eclipse中找不到它.快速搜索插件并不成功.

html eclipse export

10
推荐指数
2
解决办法
7211
查看次数

将ISerializable与DataContractSerializer一起使用时,如何阻止序列化程序输出类型信息?

为了更好地控制序列化,我将一个类从[DataContract]转换为[Serializable],实现了GetObjectData和特殊的反序列化构造函数.当我这样做时,现在发出的XML具有应用于所有元素的类型信息.我不想要这些多余的信息,我想知道如何通知序列化程序不输出它.

以下是使用[DataContract]的示例代码:

[DataContract(Namespace = "")]
class Test 
{
    public Test() { }
    [DataMember]
    public Nullable<int> NullableNumber = 7;
    [DataMember]
    public int Number = 5;

    public static void Go()
    {
        var test = new Test();
        var dcs = new DataContractSerializer(typeof(Test));
        using (var s = new StreamWriter("test.xml"))
        {
            dcs.WriteObject(s.BaseStream, test);
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

这将输出以下XML(请注意Nullable Number和Number上没有类型信息 - 这是所需的输出):

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <NullableNumber>7</NullableNumber>
  <Number>5</Number>
</Test>
Run Code Online (Sandbox Code Playgroud)

如果我修改上面的代码如下(添加[Serializable],:ISerializable和两个序列化方法):

[Serializable]
class Test : ISerializable
{
    public Test() { }
    public Nullable<int> NullableNumber = 7;
    public int Number = …
Run Code Online (Sandbox Code Playgroud)

.net c# xml serializable datacontractserializer

11
推荐指数
1
解决办法
3450
查看次数

ie8 var w = window.open() - "消息:参数无效."

我有一个只有IE8问题的网站:

代码是:

var w = window.open(urlstring, wname, wfeatures, 'false');
Run Code Online (Sandbox Code Playgroud)

错误是:

消息:参数无效.
行:419字符:5
代码:0
URI:http://HOSTNAME/js_context.js

我已经确认了代码的行号("行"和"URI"是正确的),我理解在IE8的更高版本中,这被认为是准确的.

我通过转储警报检查了调用中的所有传入参数,它们看起来都是有效的.

这个问题不会发生在FF(可能是3)上.

更新:

问题似乎是在执行"var w"时使用window.open()的结果.当我将该行分成两个语句时,它在IE8中有效.

UPDATE2:

基于:

http://javascript.crockford.com/code.html

当要立即调用函数时,整个调用表达式应该包含在parens中,以便很明显生成的值是函数的结果而不是函数本身.

这不完全是这里发生的事情,但我发现在IE8的兼容模式下应用该原则解决了这个问题.

var w = (window.open(urlstring, wname, wfeatures, false));
Run Code Online (Sandbox Code Playgroud)

javascript internet-explorer-8

113
推荐指数
5
解决办法
12万
查看次数

单元测试TSQL

是否有人为他们的TSQL存储过程,触发器,函数等编写单元测试

我最近开始制作数据库并恢复并安装部分自动Cruise Control构建过程.现在我正在考虑将它带到我们进行安装的下一级,然后运行存储过程测试列表等.

我打算使用MsBuild Extensions来调用我自己的调用.但是我知道http://www.tsqltest.org/http://tsqlunit.sourceforge.net/.我也知道TFS有sql测试.

我只是想看看现实世界中的人们在做什么,以及他们是否有任何建议.

谢谢

t-sql sql-server testing unit-testing

9
推荐指数
1
解决办法
1613
查看次数

静态字段初始化如何在C#中工作?

是否应在调用构造函数之前完成静态字段初始化?

以下程序提供的输出似乎对我不正确.

new A()
_A == null
static A()
new A()
_A == A
Run Code Online (Sandbox Code Playgroud)

代码:

public class A
{
    public static string _A = (new A()).I();

    public A()
    {
        Console.WriteLine("new A()");
        if (_A == null)
            Console.WriteLine("_A == null");
        else
            Console.WriteLine("_A == " + _A);
    }

    static A()
    {
        Console.WriteLine("static A()");
    }

    public string I()
    {
        return "A";
    }
}

class Program
{
    static void Main(string[] args)
    {
       var a = new A();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction

25
推荐指数
2
解决办法
1万
查看次数

维护消息完整性

我有一条消息说我要传递给自己,这将受到中间人攻击.因此,我担心在发送消息之前保持消息的完整性以及我收到消息的时间.

应该假设,一旦我将消息发送给自己,将来我将无法获得有关所发送消息的信息.该消息完全是自包含的.

为此,我知道应该在发送消息之前对消息内容进行散列并比较散列,并且在发送消息之后,如果它们不同,则消息已被篡改.

当然,如果中间人知道散列实际上只是消息内容的散列,那么因为消息是自包含的,他只能创建新内容并应用相同的散列算法的内容.

问题是,在生成哈希时,我应该在多大程度上随机化消息内容?什么时候到达收益递减点?

在这种情况下,我有一组键/值对.为此,我知道我必须采取的步骤是:

  1. 在邮件中添加salt.盐是世界其他地方的秘密.它在散列之前附加到消息的内容.
  2. 在生成哈希之前以一致的方式对键/值对进行排序.
  3. 虽然不直接相关,但是在散列之前会将时间戳添加到每条消息的内容中,以防止重放攻击.

这些是我正在考虑的可选步骤:

  1. 在我订购之前转换密钥.我考虑过逆转它们,然后按计数/键排序.
  2. 使用分隔键/值对的分隔符(包括键/值的分隔符和对的分隔符).

注意

此处不需要邮件隐私,因此我不寻求加密.值必须以纯文本形式传输.

最后,我应该避免哪些哈希算法?


细节

我有一个ASP.NET MVC站点,我有一个处理输入验证和持久性的控制器.

如果(基于启发式,并不重要)输入被确定为自动垃圾邮件尝试,IDictionary<string, string>则使用输入值创建模型,并将ViewResult发送到通用CAPTCHA页面.

在该视图中,在包含CAPTCHA控件的表单中,IDictionary<string, string>将在隐藏的输入字段中写出内容,并且表单的操作将与内容最初发布到的操作相同.这样,MVC可以在重新提交表单时获取值.

这是因为我无法加密键/值对(或者我可以而且应该,告诉我为什么以及如何!).

当然,我需要再添加一个值,其中包含散列消息内容.如果该值存在,则控制器将检查是否保持了消息完整性,并允许输入持久存储.

我选择使用System.Security.Cyrptography.Pkcs命名空间中的SignedCms类,该命名空间表示CMS/PKCS#7消息的链接和验证.

为了详细说明,我已经使用MAKECERT.EXE创建了一个自行颁发的证书,然后在我的代码中,我使用此处的示例对数据进行数字签名:

http://blogs.msdn.com/shawnfa/archive/2006/02/27/539990.aspx

现在,应该保持导出的私钥上的密码安全,以及服务器上的安全性,这使得它更少编程.

我将不得不为重放攻击的时间戳添加额外的密钥,但这不会太难.

答案取决于Kalium,不是因为他的初始帖子,而是他的后续评论指出了数字签名的方式,并最终发现了如何在.NET中使用它们.

感谢所有贡献的人.

language-agnostic asp.net-mvc hash digital-signature

6
推荐指数
1
解决办法
894
查看次数