我需要适用于特定类型功能的术语.
假设您在SQL数据库中编写了一个函数,其输入和输出包含在数据库事务的范围内.
也就是说,如果在数据库事务的范围内调用此函数,则该函数使用的所有数据都在同一范围内可用.它可以查询数据库表,但是它无法从文件系统读取文件,或ping网站等.如果在具有REPEATABLE READ隔离的单个事务中调用该函数两次,则应该得到相同的结果,即使其他客户端正在对数据库进行更改.
同样,除了在相同的事务范围内,该函数没有副作用.不允许在数据库事务范围之外的状态更改.该函数不应该发送电子邮件,也不应该写入文件系统,也不应该存储值memcached等.如果函数在数据库中更改数据,那没关系,因为如果调用事务被回滚,那么函数的效果也是如此.
函数的参数是可以的,因为它们基本上用作常量.
对于这种类型的函数,适当的术语是什么?"确定性"似乎并不具体.你会如何描述这类功能?
谢谢你的回答,但没有一个是我的想法.幂等因素最接近,所以我将其标记为已接受的答案.但无论如何,你们每个人都得到了我的支持.
纯函数没有副作用,它们的结果完全基于它们的参数.给出相同参数的结果总是相同的.这不起作用,因为我想到的数据库函数可以基于数据的状态,并且该函数也可以影响数据的状态.
幂等函数可以根据数据状态返回结果,并且给定相同的数据状态,结果总是相同的.但这并不适合我的想法; 无论调用函数多少次,幂等函数的效果都必须导致不变的结果.但是,事务隔离中所做的更改与该范围外部所做的更改之间没有区别.
我有一个字典,如下所示:
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指针不变.为什么我还需要const为currPtr?
2)我不明白的第二件事是:线currPtr = currPtr-> …
在以下代码中:
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
我正在开发.net中的小型Windows应用程序.我应该使用什么数据库?
数据库结构
表1:不超过3个字段:50多个记录(添加,删除)
表2:不超过10个字段:10-20个记录(添加,删除)
我想过使用XMLDatabase但有些人说不建议使用它.这是什么原因?如果可以将XML文件用作数据库,那么您可以建议一些教程或最佳实践吗?我之前使用过XML文件.使用它作为数据库有什么不同吗?
我也计划在一段时间后将这个应用程序分发给我的朋友,这些人不是程序员,他们不太懂技术.
那么,如果我使用SQL Server,我该如何在其他机器中部署它?如何将其添加到安装文件中?
更新:感谢您的回答.我要去SQLite,如果有人有兴趣,这里有一个关于SQLite和.net 的教程.
我知道NetBeans有这个功能,但我在Eclipse中找不到它.快速搜索插件并不成功.
为了更好地控制序列化,我将一个类从[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) 我有一个只有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) 是否有人为他们的TSQL存储过程,触发器,函数等编写单元测试
我最近开始制作数据库并恢复并安装部分自动Cruise Control构建过程.现在我正在考虑将它带到我们进行安装的下一级,然后运行存储过程测试列表等.
我打算使用MsBuild Extensions来调用我自己的调用.但是我知道http://www.tsqltest.org/和http://tsqlunit.sourceforge.net/.我也知道TFS有sql测试.
我只是想看看现实世界中的人们在做什么,以及他们是否有任何建议.
谢谢
是否应在调用构造函数之前完成静态字段初始化?
以下程序提供的输出似乎对我不正确.
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) 我有一条消息说我要传递给自己,这将受到中间人攻击.因此,我担心在发送消息之前保持消息的完整性以及我收到消息的时间.
应该假设,一旦我将消息发送给自己,将来我将无法获得有关所发送消息的信息.该消息完全是自包含的.
为此,我知道应该在发送消息之前对消息内容进行散列并比较散列,并且在发送消息之后,如果它们不同,则消息已被篡改.
当然,如果中间人知道散列实际上只是消息内容的散列,那么因为消息是自包含的,他只能创建新内容并应用相同的散列算法的内容.
问题是,在生成哈希时,我应该在多大程度上随机化消息内容?什么时候到达收益递减点?
在这种情况下,我有一组键/值对.为此,我知道我必须采取的步骤是:
这些是我正在考虑的可选步骤:
注意
此处不需要邮件隐私,因此我不寻求加密.值必须以纯文本形式传输.
最后,我应该避免哪些哈希算法?
细节
我有一个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中使用它们.
感谢所有贡献的人.
c# ×3
.net ×2
xml ×2
asp.net-mvc ×1
c ×1
const ×1
database ×1
dictionary ×1
eclipse ×1
export ×1
function ×1
hash ×1
html ×1
idempotent ×1
javascript ×1
pointers ×1
serializable ×1
sql-server ×1
t-sql ×1
testing ×1
unit-testing ×1